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
就会出现异常(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
wParam: virtual-key code
lParam: Specifies the repeat count, scan code, extended-key flag, ...
回4楼,你说的wParam ok了, 可是在c#中,hook函数的lParam 为IntPtr类型, 是一个非托管内存块,我要想用它,需要转换。那么就要定义与lParam一样的结构体。 你说lParam: Specifies the repeat count, scan code, extended-key flag, ... 这个"..."还包含了什么?可不可以把lParam结构写出来, 谢谢~ :》
转换为int类型:int i = lParam.ToInt32();...可不可以把lParam结构写出来
详见我在4楼帖子提供的链接。
http://www.cnblogs.com/zhaoguihua/archive/2008/10/17/1313253.html
转换为int类型:int i = lParam.ToInt32(); 这个不起作用。...可不可以把lParam结构写出来
详见我在4楼帖子提供的链接。谢谢,lParam指向的内存块 我了解。 但现在问题 是如何把它的 内容读出来。 而它又是非托管内存块,需要用Marshal类吧?
用位操作来读它的内容(不同位的意义,具体还看4楼的链接)。