大家帮我看看这个钩子过程哪里出问题了,鼠标钩子,键盘钩子都可以,但就这个窗口钩子过程有问题。
1.调试时安装是成功的,钩子也收到消息了,但那个消息“((CWPSTRUCT *)lParam)->message”是有问题的,捕获不到WM_LBUTTONDOWN
HHOOK hHook=NULL;LRESULT CALLBACK HookCallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode <0)
return CallNextHookEx(hHook,nCode,wParam,lParam);

UINT  message=((CWPSTRUCT *)lParam)->message;
switch(message)
{
case WM_LBUTTONDOWN:
{
//这里收不到消息
::MessageBox(NULL,TEXT("WM_LBUTTONDOWN"),NULL,MB_OK);
} break;
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}void SetHook()
{
hHook = SetWindowsHookEx(WH_CALLWNDPROC, HookCallWndProc, NULL,GetCurrentThreadId());
}void UnHook()
{
UnhookWindowsHookEx(hHook);
}

解决方案 »

  1.   

    我想WH_CALLWNDPROC的目的应该是处理使用CallWindowProc或SendMessage发送的消息/鼠标事件,而WM_LBUTTONDOWN是由系统放到程序消息队列中的,所以你应该使用WH_MOUSE_LL钩子
      

  2.   

    终于懂了,谢谢上面的朋友的回答!在另外一个贴找到的。WH_CALLWNDPROC类型的钩子专门用来截获通过SendMessage()函数发送到窗口的消息,不管是系统内部调用的SendMessage()函数还是用户进程中调用的SendMessage()函数。SendMessage()把消息直接交给窗口过程WndProc()来处理,WndProc()处理完消息后SendMessage()函数才返回(return   resultValue;).如果设置了WH_CALLWNDPROC类型的钩子,则当SendMessage()把消息交给WndProc时,在WndProc尚未执行前,系统调用CallWndProc钩子函数,钩子函数执行后才执行窗口过程WndProc。 
      上面所说的“发送消息”与“寄送消息”相对应,发送消息是SendMessage(),寄送消息是PoseMessage(),PostMessage把消息发送到程序的消息队列,而不是直接交给窗口过程WndProc。寄送的消息由窗口过程WndProc自动到消息队列中去取,用GetMessage()函数。 
      一般来说,键盘消息与鼠标消息都是通过PostMessge函数寄送到程序消息队列中的,所以楼主不明白的地主就在这里了。