有没有办法确定键盘或鼠标事件是否是从硬件而不是TeamViewer,Steam或Windows上运行的桌面应用程序中的其他远程桌面软件等应用程序触发的?
我的目的不是阻止僵尸程序,而是阻止远程访问应用程序。
似乎RawInput API允许我检测使用SendInput API发送的虚假事件。这是对的吗?
答案 0 :(得分:4)
SetWindowsHookEx()
提供的低级键盘/鼠标挂钩报告输入是由实际设备生成还是由应用程序代码注入。
对于low-level keyboard hook,钩子提供指向KBDLLHOOKSTRUCT
结构的指针,该结构具有flags
成员,该成员包含用于伪输入的LLKHF_INJECTED
标志。
对于low-level mouse hook,钩子提供指向MSLLHOOKSTRUCT
结构的指针,该结构的flags
成员包含LLMHF_INJECTED
或LLMHF_LOWER_IL_INJECTED
标志假输入。
任何一个钩子都可以返回一个非零值来阻止输入传递给钩子链的其余部分,从而阻止传递给目标窗口。
关于Raw Input API,根据(an older version of 1 )GetRawInputDeviceInfo()
函数的文档:
hDevice [in,optional]
类型:手柄原始输入设备的句柄。这来自WM_INPUT消息的lParam,来自RAWINPUTHEADER的hDevice成员,或来自GetRawInputDeviceList。 如果应用程序插入输入数据,也可以为NULL,例如,使用SendInput。
1 :当前版本的文档中已删除突出显示的注释,我不知道原因。
因此,WM_INPUT
消息报告的hDevice
对于虚假输入将为NULL。
但是,无法使用Raw Input API阻止输入。你仍然需要一个低级钩子。