一个SendMessage发送键盘消息没有反应的问题

时间:2023-01-24 19:32:48
我写了个代码。用于发送一个按键"F2"的消息给一个标题为test8的窗口。test8是我自己制作的一个小程序,对F2键反应弹出个消息框。但是发送消息好像不成功。test8没有反应,我不知道是否我的代码有写错。另外我也没有搞明白第四位扫描码到底怎么回事。但看有些资料说好像可以不写。请指教。

代码如下:

HWND winht=FindWindow(NULL,_T("test8"));
 ::SendMessage(winht,WM_KEYDOWN,VK_F2,0);

12 个解决方案

#1


晕了。。。我还是自己顶到上面去吧。

#2


::SendMessage(winht,WM_KEYDOWN,VK_F2,0);
改成
::PostMessage(winht, WM_KEYDOWN, VK_F2, 0);试一下。。。

#3


SendInput
不过目标程序是自己写的话,可以有别的方式,比如发注册的消息、WM_COPYDATA、通过命名管道和socket传数据等等

#4


一般发送键盘消息除了WM_KEYDOWN,还得发送WM_KEYUP吧

#5


可以不带 WM_KEYUP
看首先找的句柄是否正确
另外 不知道 WM_KEYDOWN 消息怎么处理的 

#6


先看下winht这个句柄有没找到

#7


句柄找到的话应该每问题

#8


引用 4 楼 wltg2001 的回复:
一般发送键盘消息除了WM_KEYDOWN,还得发送WM_KEYUP吧


看看这个啦

#9


帮顶。。。。。

#10


我确实没有检查句柄是否正确,问题是我没有办法在这里下断点,因为我的这个程序是注入到“test8”中的,这样断点心没有办法断到。
后来我发现其实是FindWindow前面加“::”成::FindWindow就可以了。
即如下。
HWND winht=::FindWindow(NULL,_T("test8"));
 ::SendMessage(winht,WM_KEYDOWN,VK_F2,0);

但郁闷的是。这其实不是我这个问题的主要问题。因为上面两行代码只是我不得已做的一个测试,我发现真实的情况并不是这样。
实际的情况是这样的。我用A.exe把dll.dll使用HOOK注入test8.exe,然后dll.dll模拟键盘操作test8.exe。这时候Dll发送消息用的窗口句柄是从A.exe传过来,而我好像没有办法在注入后再获得窗口句柄,因为我的窗口是使用一个类似于"任务管理器"的程序选择的,事实我并不确定是哪个窗口。
这时候我发现问题好像是DLL无法获得A.exe传过来的句柄数据。
下面我给出实际的代码。
///////////////////////////////////////////////////////////////////////////

//dll中的代码
CMainDlg *mainform;
DWORD winid;                           
HWND winht;     

void SetHook(HWND hwnd,DWORD tid)                 //导出函数,在exe中调用。
{  AFX_MANAGE_STATE(AfxGetStaticModuleState());
    winid=tid; //保存窗口线程ID,tid参数来自exe
    winht=hwnd;  //保存窗口句柄,hwnd参数来自exe
     ::SetWindowsHookEx(WH_KEYBOARD,&hookproc,::GetModuleHandle(_T("DllPro.dll")),tid);       //设置钩子
}

LRESULT CALLBACK hookproc(int code,WPARAM wParam,LPARAM lParam) //回调函数

  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  mainform=new CMainDlg;
  mainform->Create(IDD_MAINDLG);}
  mainform->ShowWindow(true);
  return CallNextHookEx(0,code,wParam,lParam);
}

//然后我在Dll载入窗口中的一个按钮事件中写入以下代码
void CDPage1::OnBnClickedBTNAuto()
{
::SendMessage(winht,WM_KEYDOWN,VK_F1,0);
}
//////////////////////////////////////////////////////////////////////////////
我是想从SetHook(HWND hwnd,DWORD tid)的参数hwnd是不是没有传给
SendMessage(winht,WM_KEYDOWN,VK_F1,0)中的winht。这里我好像没办法调试,因为注入中的中断好像不起作用。
使用HOOK的DLl注入可以传入参数吗?



#11


这是否应该另外提交成一个问题?

#12


该回复于2010-05-04 21:18:05被版主删除

#1


晕了。。。我还是自己顶到上面去吧。

#2


::SendMessage(winht,WM_KEYDOWN,VK_F2,0);
改成
::PostMessage(winht, WM_KEYDOWN, VK_F2, 0);试一下。。。

#3


SendInput
不过目标程序是自己写的话,可以有别的方式,比如发注册的消息、WM_COPYDATA、通过命名管道和socket传数据等等

#4


一般发送键盘消息除了WM_KEYDOWN,还得发送WM_KEYUP吧

#5


可以不带 WM_KEYUP
看首先找的句柄是否正确
另外 不知道 WM_KEYDOWN 消息怎么处理的 

#6


先看下winht这个句柄有没找到

#7


句柄找到的话应该每问题

#8


引用 4 楼 wltg2001 的回复:
一般发送键盘消息除了WM_KEYDOWN,还得发送WM_KEYUP吧


看看这个啦

#9


帮顶。。。。。

#10


我确实没有检查句柄是否正确,问题是我没有办法在这里下断点,因为我的这个程序是注入到“test8”中的,这样断点心没有办法断到。
后来我发现其实是FindWindow前面加“::”成::FindWindow就可以了。
即如下。
HWND winht=::FindWindow(NULL,_T("test8"));
 ::SendMessage(winht,WM_KEYDOWN,VK_F2,0);

但郁闷的是。这其实不是我这个问题的主要问题。因为上面两行代码只是我不得已做的一个测试,我发现真实的情况并不是这样。
实际的情况是这样的。我用A.exe把dll.dll使用HOOK注入test8.exe,然后dll.dll模拟键盘操作test8.exe。这时候Dll发送消息用的窗口句柄是从A.exe传过来,而我好像没有办法在注入后再获得窗口句柄,因为我的窗口是使用一个类似于"任务管理器"的程序选择的,事实我并不确定是哪个窗口。
这时候我发现问题好像是DLL无法获得A.exe传过来的句柄数据。
下面我给出实际的代码。
///////////////////////////////////////////////////////////////////////////

//dll中的代码
CMainDlg *mainform;
DWORD winid;                           
HWND winht;     

void SetHook(HWND hwnd,DWORD tid)                 //导出函数,在exe中调用。
{  AFX_MANAGE_STATE(AfxGetStaticModuleState());
    winid=tid; //保存窗口线程ID,tid参数来自exe
    winht=hwnd;  //保存窗口句柄,hwnd参数来自exe
     ::SetWindowsHookEx(WH_KEYBOARD,&hookproc,::GetModuleHandle(_T("DllPro.dll")),tid);       //设置钩子
}

LRESULT CALLBACK hookproc(int code,WPARAM wParam,LPARAM lParam) //回调函数

  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  mainform=new CMainDlg;
  mainform->Create(IDD_MAINDLG);}
  mainform->ShowWindow(true);
  return CallNextHookEx(0,code,wParam,lParam);
}

//然后我在Dll载入窗口中的一个按钮事件中写入以下代码
void CDPage1::OnBnClickedBTNAuto()
{
::SendMessage(winht,WM_KEYDOWN,VK_F1,0);
}
//////////////////////////////////////////////////////////////////////////////
我是想从SetHook(HWND hwnd,DWORD tid)的参数hwnd是不是没有传给
SendMessage(winht,WM_KEYDOWN,VK_F1,0)中的winht。这里我好像没办法调试,因为注入中的中断好像不起作用。
使用HOOK的DLl注入可以传入参数吗?



#11


这是否应该另外提交成一个问题?

#12


该回复于2010-05-04 21:18:05被版主删除