我做的是本地hook,只是想hook到自己程序中的鼠标消息。挂WH_MOUSE做的hook可以触发,但没法得到键盘和鼠标键的状态判断。即如鼠标的WM_MOUSEMOVE消息那样能在wPalam中得到消息产生时键盘的ctrl和shift以及鼠标左右键是否被按下的状态。因此我试着用WH_MOUSE_LL、WH_GETMESSAGE、WH_CALLWNDPROC、WH_SYSMSGFILTER做hook,但都没有办法被触发。

解决方案 »

  1.   

    你应该用全局变量在hook中记录鼠标键按下弹起状态。
      

  2.   

    谢谢,这的确是一个解决鼠标按下与否的思路。但是知道键盘的按键状态。我更想弄清楚怎么才能挂上WH_MOUSE_LL、WH_GETMESSAGE、WH_CALLWNDPROC、WH_SYSMSGFILTER做钩子,这样返回的参数中有完整的鼠标消息的MSG可以做得更灵活更有效。所以继续请教为什么用WH_MOUSE_LL、WH_GETMESSAGE、WH_CALLWNDPROC、WH_SYSMSGFILTER做钩子不能触发色取到消消,特别是WH_SYSMSGFILTER和WH_CALLWNDPROC
      

  3.   

    用这个函数可以知道鼠标及键盘的状态,不用全局钩子
    SHORT GetAsyncKeyState(int vKey);
      

  4.   

    请问,WH_MOUSE_LL、WH_GETMESSAGE、WH_CALLWNDPROC、WH_SYSMSGFILTER,这些类型的hook是全局的吗?必须在dll中使用是不是?
      

  5.   

    Hook 就安装来说有两种类型,线程Hook和全局Hook
    线程的钩取自己线程里的消息,全局的钩取所有线程的,每种hook都可以设为线程的也可以设为全局的,如果是安装全局hook的话就会用到Dll(有两种hook例外),线程的不用用到Dll
      

  6.   

    但是我在编译WH_MOUSE_LL型hook时错误,说这个常量未定义。我有加入windows.h也试着加入了winuser.h也不行。看了这个wh_mouse_ll的定义,可能就是这个原因。谁给我解释一下下面的预处理语句的意思。应该是这个导至编译时报错。这个WH_MOUSE_LL和WH_MOUSE_LL是不是低级键盘鼠标hook?
    #if (_WIN32_WINNT >= 0x0400)
    #define WH_KEYBOARD_LL     13
    #define WH_MOUSE_LL        14
    #endif // (_WIN32_WINNT >= 0x0400)
      

  7.   


    WH_KEYBOARD_LL 和 WH_MOUSE_LL只能在NT5.0以上版本使用(也就是WINDOW2000以上版本)_WIN32_WINNT定义的是NT的版本
    你在你自己的StdAfx.h文件中修改一下就可以了,加上如下的语句:#ifdef _WIN32_WINNT
    #undef _WIN32_WINNT
    #endif
    #define _WIN32_WINNT 0x0500