有没有办法确定键盘或鼠标事件是来自硬件还是应用程序,比如TeamViewer、Steam或其他在Windows上运行的远程桌面软件?
我的目的不是为了防止机器人,而是为了防止远程访问应用程序。
看来RawInput API让我可以检测使用SendInput API发送的虚假事件。这是正确的吗?
有没有办法确定键盘或鼠标事件是来自硬件还是应用程序,比如TeamViewer、Steam或其他在Windows上运行的远程桌面软件?
我的目的不是为了防止机器人,而是为了防止远程访问应用程序。
看来RawInput API让我可以检测使用SendInput API发送的虚假事件。这是正确的吗?
SetWindowsHookEx()
提供的低级键盘/鼠标钩子会报告输入是由实际设备生成还是由应用代码注入的。
对于低级键盘钩子, 钩子提供一个指向KBDLLHOOKSTRUCT
结构的指针,该结构具有一个flags
成员,其中包含一个LLKHF_INJECTED
标志以表示假输入。
MSLLHOOKSTRUCT
结构的指针,该结构具有一个flags
成员,其中包含一个LLMHF_INJECTED
或LLMHF_LOWER_IL_INJECTED
标志用于虚拟输入。GetRawInputDeviceInfo()
函数文档:
hDevice [输入,可选]
类型:HANDLE原始输入设备的句柄。它来自WM_INPUT消息的lParam,RAWINPUTHEADER的hDevice成员或GetRawInputDeviceList。如果应用程序通过使用SendInput插入输入数据,则它也可以为NULL。
1:文档的当前版本已删除了突出显示的注释,我不知道为什么。
因此,WM_INPUT
消息报告的hDevice
对于虚假输入将为NULL。
但是,使用原始输入API无法阻止输入。您仍然需要一个低级挂钩。
SetWindowsHookEx()
中的低级键盘/鼠标钩子确实报告输入是真实还是模拟的。据我所知,原始输入API则不会。 - Remy LebeauGetRawInputDeviceInfo
的旧文档中对于'hDevice'有一个注释: *"原始输入设备的句柄。[...] 如果应用程序通过使用SendInput插入输入数据,也可以为NULL。"*。例如,可以在XE2的API文档中找到它。现在该注释已从文档中删除,我不知道为什么,但是GetRawInputDeviceInfo
通常应该能够区分。 - Sertac Akyuz