在Wince下使用钩子函数
2008-02-26 09:35
197 查看
1:什么是钩子
从字面上理解,钩子就是想钩住些东西,在程序里可以利用钩子提前处理些Windows消息。
例子:有一个Form,Form里有个TextBox,我们想让用户在TextBox里输入的时候,不管敲键盘的哪个键,TextBox里显示的始终为“A”,这时我们就可以利用钩子监听键盘消息,先往Windows的钩子链表中加入一个自己写的钩子监听键盘消息,只要一按下键盘就会产生一个键盘消息,我们的钩子在这个消息传到TextBox之前先截获它,让TextBox显示一个“A”,之后结束这个消息,这样TextBox得到的总是“A”。
消息截获顺序:既然是截获消息,总要有先有后,钩子是按加入到钩子链表的顺序决定消息截获顺序。就是说最后加入到链表的钩子最先得到消息。
截获范围:钩子分为线程钩子和全局钩子,线程钩子只能截获本线程的消息,全局钩子可以截获整个系统消息。我认为应该尽量使用线程钩子,全局钩子如果使用不当可能会影响到其他程序。
2:使用钩子
使用钩子主要使用以下三个函数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平台下的钩子使用方法,在wince内核下是不支持的。
但我们可以通过其他的方法来实现钩子的功能。那就是直接获取钩子函数的地址,然后调用方法。
g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
如法炮制,可以获得其他两个函数的地址,有了这三个函数的地址,就可以类似这样使用了:
g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, hInstance, 0);
http://www.codeproject.com/KB/mobile/wincekbhook.aspx,有source的,大家可以去参考下
从字面上理解,钩子就是想钩住些东西,在程序里可以利用钩子提前处理些Windows消息。
例子:有一个Form,Form里有个TextBox,我们想让用户在TextBox里输入的时候,不管敲键盘的哪个键,TextBox里显示的始终为“A”,这时我们就可以利用钩子监听键盘消息,先往Windows的钩子链表中加入一个自己写的钩子监听键盘消息,只要一按下键盘就会产生一个键盘消息,我们的钩子在这个消息传到TextBox之前先截获它,让TextBox显示一个“A”,之后结束这个消息,这样TextBox得到的总是“A”。
消息截获顺序:既然是截获消息,总要有先有后,钩子是按加入到钩子链表的顺序决定消息截获顺序。就是说最后加入到链表的钩子最先得到消息。
截获范围:钩子分为线程钩子和全局钩子,线程钩子只能截获本线程的消息,全局钩子可以截获整个系统消息。我认为应该尽量使用线程钩子,全局钩子如果使用不当可能会影响到其他程序。
2:使用钩子
使用钩子主要使用以下三个函数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平台下的钩子使用方法,在wince内核下是不支持的。
但我们可以通过其他的方法来实现钩子的功能。那就是直接获取钩子函数的地址,然后调用方法。
g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
如法炮制,可以获得其他两个函数的地址,有了这三个函数的地址,就可以类似这样使用了:
g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, hInstance, 0);
http://www.codeproject.com/KB/mobile/wincekbhook.aspx,有source的,大家可以去参考下
相关文章推荐
- 在Wince下使用钩子函数
- 在Wince下使用钩子函数
- 在Wince下使用钩子函数
- 在Wince下使用钩子函数
- 在Wince下使用钩子函数
- wince上能够使用的hook是有限的
- 在WinCE 6.0上使用远程桌面控件
- 使用FreeType制作嵌入式(WINCE)使用字体文件
- Wince 6.0适用 .NET 使用HttpRequest的Post上传文件,服务端的Web API接收Post上传上来的文件 代码
- wince----settimer 和 ontimer 的使用
- Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句
- wince如何使用批处理文件进行驱动编译
- wince上能够使用的hook是有限的
- (含代码)WinCE6.0 Camera驱动的挂载,使应用层能使用DirctShow访问
- WinCE 下使用IE打开网页的方法
- Windows Mobile和Wince下使用TinyXML进行Native C++的开发
- VC2005编译SQLite,生成WINCE上使用的DLL和Lib
- WinCE中telnet,FTP及网络共享的使用方法
- WINCE驱动开发-寄存器的使用
- 基于wince.net的环境,使用pocketBuilder调用webservice所需安装环境和步骤