Hook(钩子)是一种在消息到达目标窗口前进行截获的技术。使用钩子主要使用以下三个函数SetWindowsHookEx:创建钩子
CallNextHookEx:将消息传给钩子链中的下一个钩子
UnhookWindowsHookEx:释放钩子
对于创建钩子的函数SetWindowsHookEx,MSDN给出其原形如下:
HHOOK SetWindowsHookEx(
int idHook, // type of hook to install
HOOKPROC lpfn, // address of hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // identity of thread to install hook for
);
这些在windows上面使用没有问题,但是在说明的最后,关于平台限制的地方,可以清楚的看到以下文字:Windows CE: Unsupported.
也就是说,wince并不支持钩子。
但是是不是不支持呢?只能说不直接支持钩子,用别的方法也是可以使用钩子函数的,那就是直接获取钩子函数地址,然后调用的方法。
g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
如法炮制,可以获得其他两个函数的地址,有了这三个函数的地址,就可以类似这样使用了:
g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, hInstance, 0);
关于wince的钩子,有以下总结,不尽不对之处,请给飞狐指正:
1 参看WinCE的winbase.h,wince下可以使用以下三种:
#define WH_JOURNALRECORD 0
#define WH_JOURNALPLAYBACK 1
#define WH_KEYBOARD_LL 20
其中最有用的就是键盘钩子了。Wince里面定义其为20,而不是windows里面的14,因此调用时要注意。
2 关于键盘钩子回调函数keyboardProc,它里面的几个参数并不像MSDN里面提到的KeyboardProc那样:
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
按照说明,wParam应该存的是虚拟键信息。然而事实上,这三个函数中,第二个是用来指示是键按下还是弹起,第三个参数lParam才是真正存储的按键信息数据。它存储的是一个KBDLLHOOKSTRUCT结构体指针。这个结构体定义如下:
typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT;
结构体里面才是真正的按键信息。
3对于键盘钩子,我只能使用一个,如果创建二个钩子来检测(不管是使用同一个dll,还是两个不同的dll),则第一个可以正常工作,但是第二个会报错,错误id是31 ERROR_GEN_FAILURE即
A device attached to the system is not functioning.
不知道哪位高手有解决方案?
4 钩子有线程级和全局钩子,但是我只试验成功了全局钩子,工作很好,但是线程级钩子还没有成功。
5 钩子用途很多,我们就用它和驱动打交道,具体也不多说了。
钩子函数源代码在采用codeproject网站上面Prathamesh S Kulkarni的源代码基础上,增加了处理按键消息的部分,代码比较长,就不贴了,有需要的可以交流,或者参看Prathamesh S Kulkarni的文章。
wince中的hook(钩子)用法
最新推荐文章于 2017-03-23 13:17:02 发布