0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术WinCE系统鼠标键盘钩子使用方法简介

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-05 11:27 次阅读

在实际应用中,有时程序需要在特定的鼠标、按键事件后,执行一些操作,比如:

1、点击触摸屏时触发蜂鸣器。

2、在休眠状态点击触摸屏后,让程序结束休眠状态。

3、设定全局的按键功能,如一键截图或一键关机。

4、过滤一些鼠标或键盘操作等等。

这时,可以使用键盘鼠标钩子来实现这些功能。

钩子是WINDOWS/WINCE系统独有的消息处理机制。通过系统调用,将消息处理程序段挂入系统,获得消息处理优先控制权,在消息达到目的窗口前进行处理。钩子函数可以通过判断决定是否加工处理(改变)消息,或不做处理继续传递各消息,或强制结束消息传递。

钩子有很多种,WINCE系统已精简到只有4种钩子。同时钩子又可做局部钩子或全局钩子,局部钩子仅在指定进程内生效,而全局钩子在系统范围内都生效。一般的全局钩子需要挂载到dll中使用,本文介绍的鼠标钩子和键盘钩子较特殊,不需要挂载到dll中即可全局生效。

钩子的运行逻辑如下图,每种钩子可以挂入任意多个钩子函数,以链表方式存储。系统优先访问链表首位的钩子,然后依次传递消息给后面的钩子处理。后挂入的钩子位于链表的前端。

使用方法

添加钩子分3步。

1、编写钩子函数处理代码

2、调用API函数将钩子函数挂入系统

3、创建消息循环,使钩子运作起来

添加引用

使用钩子需要用到函数,SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx。及键盘钩子鼠标钩子的定义,及键盘消息,鼠标消息的结构体定义,均定义在pwinuser.h中。

#include "pwinuser.h"

创建需要挂入系统的消息处理函数

即钩子函数,钩子函数定义必须为制定的格式。

钩子函数根据实际应用需求,决定是否调用CallNextHookEx,将消息传递给后面的钩子处理。

首位的钩子函数返回值决定该消息是丢弃,还是传给系统消息处理函数,再分发给各窗口。

以下为键盘及鼠标钩子函数的示例。

键盘钩子函数

该键盘钩子示例函数中,当检测到按键‘1’按下时,调用Beep函数触发蜂鸣器。

LRESULT CALLBACK KeyboardProc(intnCode,WPARAM wParam,LPARAM lParam)

{

KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;

if(wParam == WM_KEYDOWN) //按钮按下

{

switch(pkbhs->vkCode)

{

case0x31: //按钮‘’

Beep();

break;

defaut:

break;

}

}

returnCallNextHookEx(NULL,nCode,wParam,lParam);

}

注:

1、WINCE键盘钩子函数得到的WPARAM记录的消息类别,如按键是按下消息WM_KEYDOWN还是弹起消息WM_KEYUP。

LPARAM指向键盘消息结构体KBDLLHOOKSTRUCT,里面记录有详细信息,如触发的按键是什么,有没有辅助按下ALT键或者CTRL键,等等。

2、钩子队列第一个钩子的返回值决定系统是否能接受到该消息。

返回0表示,将消息传递给系统消息处理函数继续处理。

返回1表示,丢弃消息,系统将收不到该消息。

调用CallNextHookEx表示调用下一个钩子消息处理函数,如果不调用,那么后面的钩子函数将不产生作用。

鼠标(触摸屏)钩子函数

该鼠标钩子示例函数中,当检测到鼠标或触摸屏点击时,调用Beep函数触发蜂鸣器。

LRESULT CALLBACK MouseHookProc(intnCode, WPARAM wParam, LPARAM lParam)

{

MSLLHOOKSTRUCT *pmshs = (MSLLHOOKSTRUCT *) lParam;

if(wParam == WM_LBUTTONDOWN) //鼠标点击处理代码

{

Beep();

}

returnCallNextHookEx(NULL,nCode,wParam,lParam);

}

注:

1、WINCE鼠标钩子函数得到的WPARAM记录的消息类别,如是鼠标按下还是弹起,还是双击,移动,等等。

LPARAM记录的详细信息,如点击坐标,滚轮参数等等。

2、触摸屏消息和鼠标消息是一样的。

3、钩子队列第一个钩子的返回值决定系统是否能接受到该消息。

返回0表示,将消息传递给系统消息处理函数继续处理。

返回1表示,丢弃消息,系统将收不到该消息。

调用CallNextHookEx表示调用下一个钩子消息处理函数,如果不调用,那么后面的钩子函数将不产生作用。

Beep函数

在本文示例中,将嵌入式板子GPIO15连接上一个蜂鸣器,通过设置GPIO电平触发蜂鸣器。

在程序初始段打开GPIO,获得GPIO句柄。

#include"isa_dio.h"

HANDLE hGpio;

hGpio = OpenGPIO( _T("PIO1:"));

添加Beep函数,通过GPIO句柄操作GPIO15。

voidBeep()

{

GPIO_OutClear(hGpio, GPIO15);

Sleep(10);

GPIO_OutSet(hGpio, GPIO15);

}

添加钩子

在主线程中调用SetWindowsHookEx函数向系统添加钩子。

第一个参数为添加的钩子类型,WH_KEYBOARD_LL为键盘钩子,WH_MOUSE_LL为鼠标钩子。

第二个参数为注入的消息处理函数指针,即前面定义的钩子函数。

第三个参数为钩子程序的instance指针,本文介绍的钩子并不需要挂载到dll中使用,所以简单设置为NULL即可。

最后个参数为钩子关联的线程句柄,这里为0表示关联所有线程,即全局钩子。

函数返回NULL表示添加钩子失败,成功返回钩子句柄。

示例代码如下:

HINSTANCE hInstance = NULL;

HHOOK g_hKBDhook = NULL;

HHOOK g_hMouseHook = NULL;

g_hKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0);

if(g_hKBDhook == NULL)

{

returnfalse;

}

g_hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, hInstance, 0);

if(g_hMouseHook == NULL)

{

returnfalse;

}

添加消息循环

钩子机制是基于消息循环的,所以添加消息循环是必须的,如果没有添加消息循环,会导致系统消息进入钩子后卡死。

MFC框架的程序已经自带消息循环。

而命令行的程序则需要在主函数里添加以下代码。

MSG msg;

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

删除钩子

当不需要钩子时,应当主动释放钩子。

UnhookWindowsHookEx(g_ hKBDhook);

UnhookWindowsHookEx(g_hMouseHook);

英创提供了例程及源代码,有需要的客户可以联系英创工程师获得。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • WINDOWS
    +关注

    关注

    3

    文章

    3503

    浏览量

    87881
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6081

    浏览量

    34940
收藏 人收藏

    评论

    相关推荐

    梯度科技入选2023年信息技术应用创新解决方案名单

    日前,工业和信息化部网络安全产业发展中心(工业和信息化部信息中心)在天津举办2024信息技术应用创新发展大会暨解决方案应用推广大会。会上正式公布了2023年
    的头像 发表于 09-09 16:29 267次阅读

    MSP430 FRAM技术使用方法和最佳实践

    电子发烧友网站提供《MSP430 FRAM技术使用方法和最佳实践.pdf》资料免费下载
    发表于 08-23 09:23 0次下载
    MSP430 FRAM<b class='flag-5'>技术</b>–<b class='flag-5'>使用方法</b>和最佳实践

    如何实现iPad在充电的同时还能使用键盘鼠标 | LDR6020

    了使用的便捷性和效率。 iPad键鼠同时充电OTG技术原理: 设备连接 通过Type-C接口,iPad可以同时连接外接的键盘鼠标。此时,iPad作为主机设备,负责管理和控制连接的设备。 OTG角色切换 由于OTG
    的头像 发表于 06-15 18:12 422次阅读
    如何实现iPad在充电的同时还能使用<b class='flag-5'>键盘</b>和<b class='flag-5'>鼠标</b> | LDR6020

    esp-idf传递鼠标数据延迟很大的原因?

    请假一下,用espidf通过wifi传递鼠标键盘时间,延迟很大,可能是哪地方的问题呢?采用select机制,鼠标数据通过uart回来,然后通过Wi-Fi传递给对方,socket已设置no_delay。发现用ardunio做的话延迟还小一些。对这种数据量小但延迟要求比较高的
    发表于 06-14 06:19

    USB口接鼠标键盘可用,接U盘不能正常使用

    现自制飞凌A40i核心板底板,通过USB2514芯片将其中一路USB扩展4路,就是USB hub的形式,这4路USB接鼠标键盘均可以正常使用,然而接上U盘后,不能正常使用,U盘无法打开,感觉系统像是
    发表于 05-13 20:02

    翼辉信息入选2023年信息技术应用创新解决方案名单

    近日,2023 年(第五届)信息技术应用创新解决方案公布遴选名单,历经资格初审、技术中评、区域评议、终评预审,翼辉以“面向工业领域嵌入式操作系统 SylixOS 解决方案”,成功在全国优秀方案中脱颖而出,入选典型解决方案名单。
    的头像 发表于 04-28 11:37 401次阅读
    翼辉<b class='flag-5'>信息</b>入选2023年<b class='flag-5'>信息技术</b>应用创新解决方案名单

    STM32F407 USB HOST HID部分鼠标键盘无法读取数据的原因?

    初学STM32F4 USB,现在使用正点原子USB HID鼠标键盘例程,该历程使用2.1的库,调试发现手里的鼠标(一个有线,一个无线)可以识别,也能进键盘鼠标的初始化程序,但是之后动
    发表于 04-22 08:22

    龙芯中科三项信方案入围工信部2023年信息技术应用创新应用示范案例名单

    近日,工业和信息化部通报了2023年信息技术应用创新解决方案征集遴选结果,本次共评选出典型解决方案173个、应用示范案例83个、单项创新案例64个。
    的头像 发表于 03-07 16:45 673次阅读
    龙芯中科三项信<b class='flag-5'>创</b>方案入围工信部2023年<b class='flag-5'>信息技术</b>应用创新应用示范案例名单

    labview鼠标坐标怎么获取

    获取LabVIEW中鼠标坐标的方法实际上非常简单。在LabVIEW的Block Diagram或Front Panel中,可以使用以下方法来获取鼠标的坐标: 使用
    的头像 发表于 01-07 17:24 3208次阅读

    Python 模拟键盘鼠标的方式实现自动化

    在某些情况下,如果我们需要进行自动化操作的应用没有提供相应的接口,我们无法直接通过Python来调用API实现自动化。这种情况下,Python也不是完全没有办法的,我们可以采用模拟键盘鼠标的方式
    的头像 发表于 11-02 14:48 1052次阅读
    Python 模拟<b class='flag-5'>键盘</b><b class='flag-5'>鼠标</b>的方式实现自动化

    无线鼠标和接收器是一对一的关系吗?无线鼠标键盘的接收器丢了怎么办?

    无线鼠标和接收器是一对一的关系吗?无线鼠标键盘的接收器丢了怎么办? 关于无线鼠标和接收器的一对一关系,答案是不完全是。虽然大多数情况下无线鼠标和接收器是成对出现的,但并不是说只有这个接
    的头像 发表于 10-30 10:56 4087次阅读

    OTG功能使用方法

    OTG功能使用方法  什么是OTG功能? OTG(On-The-Go)即为“即插即用”的高速USB接口,在目前的市场上企业和普通消费者极度青睐,其在人们的生活中的应用场景非常广泛,比如U盘、键盘
    的头像 发表于 10-30 09:57 3016次阅读

    开鸿智谷受邀参加2023软件和信息技术服务业创新发展论坛

    10月18日,以“智荟雄安想未来”为主题的雄安新区2023软件和信息技术服务业创新发展论坛在雄安新区国际酒店会议中心召开。本次论坛以推动软件和信息技术服务业创新发展为目的,邀行政校企各级单位共商共建。开鸿智
    的头像 发表于 10-20 08:30 689次阅读
    开鸿智谷受邀参加2023软件和<b class='flag-5'>信息技术</b>服务业创新发展论坛

    LED在键盘鼠标上的应用

    随着生活水平的提高,人们对各类物件的要求也逐渐升高,电脑更新迭代,厂家对键盘鼠标这些小配件也做了许多趣味性的升级,从一开始单一的键盘发展为可以发光的单色键盘,到现在的多色发光,再到可以
    的头像 发表于 10-13 17:34 1320次阅读
    LED在<b class='flag-5'>键盘</b>、<b class='flag-5'>鼠标</b>上的应用

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48