C#模拟键盘输入、键状态和监听键盘消息
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
模拟键盘输入模拟键盘输入的功能需要依赖Windows函数实现,这个函数是SendInput,它是专门用来模拟键盘、鼠标等设备输入的函数。 另外和键盘输入相关的函数还有SendKeys,它是System.Windows.Forms. SendKeys,只能在WinFrom项目中使用,并且它的所有功能都可以由SendInput来实现。 另一个是keybd_event函数,这个函数依然是有用的,但是目前官方已经推荐使用SendInput替代它了。 SendInput的定义INPUT对象中保存了输入内容,nInputs和cbSize代表pInputs的长度和INPUT结构的大小,这两个参数能帮助SendInput正确解析INPUT对象。返回值0表示失败,非零表示正确执行。
INPUT的定义INPUT结构中的type表示消息类型,值为1表示键盘消息。mkhi表示具体的消息内容,它可以模拟三类消息,其中键盘消息使用KEYBDINPUT表示,其它消息类型的结构不在这里介绍(虽然用不到MOUSEINPUT等结构,但是它们的定义不能省略,否则SendInput无法正确解析INPUT中的具体内容)。 FieldOffset(0)将三个结构的起始都放在0位置,所以只能使用其中一个内容,因为一个INPUT也只能表示一个消息,这样设计可以节省空间。 KEYBDINPUT结构中的wVK表示虚拟键码 ,dwFlags的第一位bit默认0表示键盘按下事件,1表示键盘释放事件。 虚拟键码是一种能让Windows以与设备无关的方式处理键盘的技术,可以简单理解为:键盘上的每个键用一个数字来表示。
模拟A键A键的虚拟键码是0x41。type=1表示这是键盘消息,dwFlags=2表示键盘释放事件。 这里INPUT数组模拟的就是使用物理键盘A键的过程。inputs[0]模拟A键按下,inputs[1]模拟A键释放。
模拟Ctrl+A0x11是Ctrl的虚拟键码,这里模拟了按下Ctrl键,按下A键,释放A键,释放Ctrl键的过程,实现了Ctrl+A的组合键效果。
SendInput除了能模拟击键消息外还可以在文本输入中模拟字符消息。 KEYBDINPUT结构的wScan表示字符内容,将dwFlags的第二位bit置1表示使用wScan属性而非wVK。 文本输入
键状态有时需要知道键盘按键的当前状态,可以使用GetKeyState函数。 GetKeyState的定义 参数是键的虚拟码,对于开关键(Caps Look、Num Lock和Scroll Lock),返回值1表示开启状态。对于其它键返回负数表示按下状态。 CapsLock键状态
监听键盘消息对于WinForm和WPF程序,要监听输入到本程序的键盘消息直接使用窗口的KeyDown和KeyUp事件即可。 对于其它键盘消息(即给本程序以外的键盘消息),需要使用钩子(hook)。 钩子是Windows系统消息处理机制中的一个节点,可以安装钩子来监听系统中的Windows消息。 Windows消息分很多种,对于特定的一类消息需要使用对应的特定类型的钩子,这里只介绍键盘消息的钩子。 钩子的安装需要调用系统SetWindowsHookEx方法。
SetWindowsHookEx的定义idHook等于13表示全局键盘消息钩子,lpfn代表键盘消息处理程序,返回非IntPtr.Zero表示安装成功。
安装钩子KeyboardHookCallback就是自定义的具体处理键盘消息的方法。
消息处理从lParam中读取键的虚拟码(lParam其实是指向类似前文提到的KEYBDINPUT结构的指针),wParam表示击键事件的类型。CallNextHookEx将消息传递给下一个消息处理节点。 使用前文提到的SendInput方法模拟键盘输入也能被钩子监听到。 应避免在消息处理过程中进行耗时操作。
卸载钩子需要使用UnhookWindowsHookEx UnhookWindowsHookEx的定义 传入SetWindowsHookEx的返回值即可,返回true则卸载成功。 作者:左眼水星 该文章在 2024/8/19 8:44:18 编辑过 |
关键字查询
相关文章
正在查询... |