WinCE系统鼠标键盘钩子使用方法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这时,可以使用键盘鼠标钩子来实现这些功能。
钩子是 WINDOWS/WINCE 系统独有的消息处理机制。通过系统调用,将消息处理程序段挂入系统, 获得消息处理优先控制权,在消息达到目的窗口前进行处理。钩子函数可以通过判断决定是否加工处理 (改变)消息,或不做处理继续传递各消息,或强制结束消息传递。
钩子有很多种,WINCE 系统已精简到只有 4 种钩子。同时钩子又可做局部钩子或全局钩子,局部钩 子仅在指定进程内生效,而全局钩子在系统范围内都生效。一般的全局钩子需要挂载到 dll 中使用,本文 介绍的鼠标钩子和键盘钩子较特殊,不需要挂载到 dll 中即可全局生效。
WinCE 系统鼠标键盘钩子使用方法
钩子机制是基于消息循环的,所以添加消息循环是必须的,如果没有添加消息循环,会导致系统消 息进入钩子后卡死。
MFC 框架的程序已经自带消息循环。 而命令行的程序则需要在主函数里添加以下代码。 MSG msg; while(GetMessage(&msg, NULL, 0, 0)) {
创建需要挂入系统的消息处理函数 即钩子函数,钩子函数定义必须为制定的格式。 钩子函数根据实际应用需求,决定是否调用 CallNextHookEx,将消息传递给后面的钩子处理。 首位的钩子函数返回值决定该消息是丢弃,还是传给系统消息处理函数,再分发给各窗口。 以下为键盘及鼠标钩子函数的示例。
键盘钩子函数
TranslateMessage(&msg); DispatchMessage(&msg); }
删除钩子 当不需要钩子时,应当主动释放钩子。 UnhookWindowsHookEx(g_ hKBDhook); UnhookWindowsHookEx(g_hMouseHook);
英创提供了例程及源代码,有需要的客户可以联系英创工程师获得。
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
WinCE 系统鼠标键盘钩子使用方法
在实际应用中,有时程序需要在特定的鼠标、按键事件后,执行一些操作,比如: 1、点击触摸屏时触发蜂鸣器。 2、在休眠状态点击触摸屏后,让程序结束休眠状态。 3、设定全局的按键功能,如一键截图或一键关机。 4、过滤一些鼠标或键盘操作等等。
钩子的运行逻辑如下图,每种钩子可以挂入任意多个钩子函数,以链表方式存储。系统优先访问链 表首位的钩子,然后依次传递消息给后面的钩子处理。后挂入的钩子位于链表的前端。
使用方法 添加钩子分 3 步。 1、编写钩子函数处理代码 2、调用 API 函数将钩子函数挂入系统 3、创建消息循环,使钩子运作起来
添加引用
第二个参数为注入的消息处理函数指针,即前面定义的钩子函数。
第三个参数为钩子程序的 instance 指针,本文介绍的钩子并不需要挂载到 dll 中使用,所以简单设
置为 NULL 即可。
最后个参数为钩子关联的线程句柄,这里为 0 表示关联所有线程,即全局钩子。
函数返回 NULL 表示添加钩子失败,成功返回钩子句柄。
5/5
该键盘钩子示例函数中,当检测到按键‘1’按下时,调用 Beep 函数触发蜂鸣器。
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
return false; } g_hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, hInstance, 0); if(g_hMouseHook == NULL) {
return false; }
添加消息循环
4/5
成都英创信息技术有限公司
鼠标(触摸屏)钩子函数 该鼠标钩子示例函数中,当检测到鼠标或触摸屏点击时,调用 Beep 函数触发蜂鸣器。 LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
MSLLHOOKSTRUCT *pmshs = (MSLLHOOKSTRUCT *) lParam; if(wParam == WM_LBUTTONDOWN) //鼠标点击处理代码 {
GPIO_OutClear(hGpio, GPIO15); Sleep(10); GPIO_OutSet(hGpio, GPIO15); }
添加钩子
在主线程中调用 SetWindowsHookEx 函数向系统添加钩子。
第一个参数为添加的钩子类型,WH_KEYBOARD_LL 为键盘钩子,WH_MOUSE_LL 为鼠标钩子。
Beep(); } return CallNextHookEx(NULL,nCode,wParam,lParam); }
注: 1、WINCE 鼠标钩子函数得到的 WPARAM 记录的消息类别,如是鼠标按下还是弹起,还是双击, 移动,等等。
LPARAM 记录的详细信息,如点击坐标,滚轮参数等等。 2、触摸屏消息和鼠标消息是一样的。 3、钩子队列第一个钩子的返回值决定系统是否能接受到该消息。
if(wParam == WM_KEYDOWN)
//按钮按下
{
switch(pkbhs->vkCode)
{
case 0x31: //按钮‘’
Beep();
break;
defaut:
break;
}
}
return CallNextHookEx(NULL,nCode,wParam,lParam);
}
注: 1、WINCE 键盘钩子函数得到的 WPARAM 记录的消息类别,如按键是按下消息 WM_KEYDOWN 还是弹起消息 WM_KEYUP。
在程序初始段打开 GPIO,获得 GPIO 句柄。 #include "isa_dio.h" HANDLE hGpio; hGpio = OpenGPIO( _T("PIO1:"));
3/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
添加 Beep 函数,通过 GPIO 句柄操作 GPIO15。 void Beep() {
1/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
使用钩子需要用到函数,SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx。 及键盘钩子鼠标钩子的定义,及键盘消息,鼠标消息的结构体定义,均定义在 pwinuser.h 中。
#include "pwinuser.h"
LPARAM 指向键盘消息结构体 KBDLLHOOKSTRUCT,里面记录有详细信息,如触发的按键是 什么,有没有辅助按下 ALT 键或者 CTRL 键,等等。
2、钩子队列第一个钩子的返回值决定系统是否能接受到该消息。
2/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
返回 0 表示,将消息传递给系统消息处理函数继续处理。 返回 1 表示,丢弃消息,系统将收不到该消息。 调用 CallNextHookEx 表示调用下一个钩子消息处理函数,如果不调用,那么后面的钩子函数 将不产生作用。
示例代码如下:
HINSTANCE
hInstance = NULL;
HHOOK
g_hKBDhook = NULL;
HHБайду номын сангаасOK
g_hMouseHook = NULL;
g_hKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0); if(g_hKBDhook == NULL) {
返回 0 表示,将消息传递给系统消息处理函数继续处理。 返回 1 表示,丢弃消息,系统将收不到该消息。 调用 CallNextHookEx 表示调用下一个钩子消息处理函数,如果不调用,那么后面的钩子函数 将不产生作用。
Beep 函数 在本文示例中,将嵌入式板子 GPIO15 连接上一个蜂鸣器,通过设置 GPIO 电平触发蜂鸣器。
相关文档
最新文档