WH_KEYBOARD_LL与WH_MOUSE_LL是系统级的消息类型,WH_KEYBOARD与WH_MOUSE是进程级的消息类型,WH_KEYBOARD_LL, WH_MOUSE_LL,WH_MOUSE都有对应的结构体, 为什么WH_KEYBOARD没有? WH_KEYBOARD 对应的结构体是什么呢?注:如果我将Hook到WH_KEYBOARD消息类型的lParam(非托管内存块)转换成WH_KEYBOARD_LL对应的结构体 
就会出现异常(Attempted to read or write protected memory),代码如下://KeyboardHookStruct为WH_KEYBOARD_LL的结构体KeyboardHookStruct khh= (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct))     
 这证明了WH_KEYBOARD_LL对应的结构体不能用到WH_KEYBOARD上。WH_KEYBOARD 对应的结构体是什么呢?  谢谢.
WinUser.h中
WH_KEYBOARD_LL 对应的结构体是
typedef struct tagKBDLLHOOKSTRUCT {
    DWORD   vkCode;
    DWORD   scanCode;
    DWORD   flags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCTWH_MOUSE_LL 对应的结构体是typedef struct tagMSLLHOOKSTRUCT {
    POINT   pt;
    DWORD   mouseData;
    DWORD   flags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCTWH_MOUSE 对应的结构体是typedef struct tagMOUSEHOOKSTRUCT {
    POINT   pt;
    HWND    hwnd;
    UINT    wHitTestCode;
    ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT

解决方案 »

  1.   

    WH_KEYBOARD的回调是LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam,  LPARAM lParam );它没有对应的结构,击键信息都包含在wParam和wParam中了(就是两个32位的整数):
    wParam: virtual-key code
    lParam: Specifies the repeat count, scan code, extended-key flag, ...
      

  2.   


    回4楼,你说的wParam ok了, 可是在c#中,hook函数的lParam 为IntPtr类型, 是一个非托管内存块,我要想用它,需要转换。那么就要定义与lParam一样的结构体。 你说lParam: Specifies the repeat count, scan code, extended-key flag, ...    这个"..."还包含了什么?可不可以把lParam结构写出来, 谢谢~ :》
      

  3.   

    ...可是在c#中,hook函数的lParam 为IntPtr类型,
    转换为int类型:int i = lParam.ToInt32();...可不可以把lParam结构写出来
    详见我在4楼帖子提供的链接。
      

  4.   

    参考
    http://www.cnblogs.com/zhaoguihua/archive/2008/10/17/1313253.html
      

  5.   


    转换为int类型:int i = lParam.ToInt32(); 这个不起作用。...可不可以把lParam结构写出来 
    详见我在4楼帖子提供的链接。谢谢,lParam指向的内存块 我了解。 但现在问题 是如何把它的 内容读出来。   而它又是非托管内存块,需要用Marshal类吧? 
      

  6.   

    ...谢谢,lParam指向的内存块 我了解。 但现在问题 是如何把它的 内容读出来。  而它又是非托管内存块,需要用Marshal类吧?我再重复一次:(在这里)lParam不指向任何的内存块,它就是一个32位的数字。
    用位操作来读它的内容(不同位的意义,具体还看4楼的链接)。
      

  7.   

    非常感谢。已解决。lParam转换成int, 进行位操作 就可以了。