键盘钩子全网最详讲解实现扫描枪传输数据的接收(C++ C#)

目录


1、使用需求
2、实现思路
3、用到技术点
4、钩子概述
5、钩子基本原理
6、使用到的WIN32API接口
7、键盘钩子基础实现实例
8、C++键盘钩子封装类实现
9、C#键盘钩子封装类实现


1、使用需求

近期在C++项目中用到通过扫码枪将二维码(一维码)信息传输到窗体中。

2、实现思路

通过查看扫码枪的说明书可知,扫描枪传输数据可支持标准键盘模拟输入,于是可通过键盘钩子监听事件来实现。

3、用到技术点

单例模式

键盘钩子

回调函数

4、钩子概述

首先windows操作系统是建立在事件驱动机制的基础上的,简单来说,系统各窗口之间的沟通都是通过消息的相互传递而实现的,通常应用程序只能处理来自程序内部进程之间或进程自己传递的消息。如果需要对进程之外传递的消息进行拦截处理,就要用到(HOOK)钩子技术。

5、钩子基本原理

钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入到系统。钩子的种类有很多(比如键盘钩子,鼠标钩子等),每一种钩子负责截获并处理相应的消息。钩子机制允许应用程序截获并处理发往指定窗口的消息或特定事件。在特定消息发出,并在到达目的窗口之前,钩子程序先行截获此消息并得到对其的控制权。此时在预先设定好的钩子函数中可以对截获的消息进行各种修改处理,甚至强行终止该消息的继续传递。使用钩子时可以根据其监视范围的不同将其分为全局钩子和线程钩子,其中线程钩子只能监视某个线程,而全局钩子则可以对当前系统下运行的所有线程进行监视,显然,线程钩子可以看做是全局钩子的一个子集,全局钩子虽然功能比较强大但同时实现起来比较繁琐,比如钩子实现函数必须封装在动态链接库中才可以使用。

6、使用到的WIN32API接口

6.1 SetWindowsHookEx

API函数SetWindowsHookEx()把一个应用程序定义的钩子线程安装到钩子链表中,该函数总是在Hook链表的开头安装。

函数原型

HHOOK SetWindowsHookEx(
  int       idHook,
  HOOKPROC  lpfn,
  HINSTANCE hMod,
  DWORD     dwThreadId
);

参数说明:

  • idHook:指定要安装的钩子类型。可以是以下之一:
  •       WH_KEYBOARD_LL: 用于监视键盘输入。
  •       WH_MOUSE_LL: 用于监视鼠标事件。
  •       其他钩子类型,用于监视不同类型的事件。
  • lpfn:指定一个回调函数的地址,当特定事件发生时,该函数将被调用。
  • hMod:指定包含钩子函数的模块句柄。通常情况下,可以将其设置为 NULL,表示使用当前进程的模块句柄。
  • dwThreadId:指定要关联钩子的线程ID。如果是全局钩子,可以将其设置为 0,将钩子应用到所有线程。
  • SetWindowsHookEx 返回一个非零值,表示成功安装钩子,或者返回 NULL 表示安装失败。安装成功后,钩子函数将开始监视并处理指定类型的事件。

6.2 UnhookWindowsHookEx

接口功能:卸载钩子

函数原型

BOOL WINAPI UnhookWindowsHookEx( __in HHOOK hhk);

参数说明

参数:hhk [in]

类型: HHOOK

要删除的钩子的句柄。这个参数是上一个函数SetWindowsHookEx的返回值.

返回值

类型: BOOL

如果函数成功,返回值为非零值。

如果函数失败,返回值为零。 要获得更多的错误信息,调用GetLastError函数.

6.3 GetKeyNameTextA

主要负责根据指定的键盘消息参数(lParam)返回与之对应的键名字符串。这个函数在开发涉及键盘输入处理的程序时非常有用,如日志记录、游戏控制或虚拟键盘应用等。

函数原型

nt GetKeyNameTextA(  
  [in] LONG lParam,  
  [out] LPSTR lpString,  
  [in] int cchSize  
);

参数说明
lParam:指定被处理的键盘消息的第二个参数,如WM_KEYDOWN或WM_KEYUP等消息。此参数包含了键盘扫描码、扩展键标志等信息。
16-23位:扫描代码,该值取决于OEM(原始设备制造商)。
第24位:扩展标志,用于指示键是否是扩展键(如增强型101或102键键盘上的右键和Ctrl键)。如果是扩展键,则值为1;否则为0。
第25位:“不在乎”位,调用此函数的应用程序设置此位,以指示该函数不应区分左右Ctrl和SHIFT键等。
lpString:指向接收键名字符串的缓冲区的指针。
cchSize:指定键名字符串的最大长度(以字符为单位),包括终止的null字符。这个参数应该与lpString参数指向的缓冲区的大小相等。
返回值
如果函数成功,将复制一个以null结尾的字符串到指定的缓冲区中,并返回字符串的长度(以字符为单位),不包括终止的null字符。
如果函数失败,返回值为0。此时,可以通过调用GetLastError函数获取扩展的错误信息。

6.4 GetKeyboardState

用于获取当前键盘上所有虚拟键的状态,并将这些状态信息复制到一个指定的缓冲区中。

函数原型

BOOL GetKeyboardState(  
  [out] PBYTE lpKeyState  
);

参数
lpKeyState:指向一个256字节的数组,该数组用于接收每个虚拟键的状态。数组的每个元素都对应一个虚拟键,其索引从0到255。
返回值
如果函数成功,返回值为非零值(TRUE)。
如果函数失败,返回值为零(FALSE)。在函数失败时,可以通过调用GetLastError函数来获取更多的错误信息。 

7、键盘钩子基础实现

 下面这段代码设置了一个低级键盘钩子(WH_KEYBOARD_LL),它能够全局捕获按键消息。钩子过程KeyboardHookProc

扫描枪是一种用于快速扫描条形码或二维码的设备。它将光束或激光束照射在条形码上,并通过识别条码的黑白条纹来将其转化为数字信号。这些数字信号可以被电脑或其他设备识别和处理。扫描枪广泛应用于商业领域,特别是零售业和仓储管理中,可以快速准确地读取商品的条形码,提高工作效率和减少人工错误。 而键盘钩子是一种软件技术,用于在操作系统上截取键盘输入。它可以监控用户在键盘上的按键操作,并将获取的按键信息传递给应用程序或系统。键盘钩子可以用于实现各种功能,比如记录用户的输入、实现快捷键功能、监控键盘活动等。 扫描枪通过将扫描的条码信息转化为键盘输入的方式与计算机或其他设备进行交互。当扫描枪扫描到条码后,它会将对应的数字序列通过模拟键盘输入的方式发送给计算机,就像用户手动输入一样。而此时,如果有键盘钩子程序在运行,它可以截取到扫描枪发送的键盘输入信息,并进行相应的处理。 因此,扫描枪键盘钩子可以结合使用,实现更加高效的数据录入和处理。扫描枪可以快速准确地读取条码,键盘钩子可以截取并处理相应的键盘输入信息。这种结合可以在零售业、物流管理等场景中提高数据录入的速度和准确性,减少人工错误,提高工作效率。同时,扫描枪的使用也可以减轻人工劳动负担,提高工作舒适度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萝卜兽编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值