首页>
技术资讯>
详情

wince中的hook(钩子)用法

2016-05-12 来源:佚名 阅读量: 0
关键词: WINCE

    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的文章。

热门推荐 查看更多