检测软件是否触发键盘或鼠标事件

时间:2016-05-24 10:55:48

标签: windows delphi remote-desktop keyevent raw-input

有没有办法确定键盘或鼠标事件是否是从硬件而不是TeamViewer,Steam或Windows上运行的桌面应用程序中的其他远程桌面软件等应用程序触发的?

我的目的不是阻止僵尸程序,而是阻止远程访问应用程序。

似乎RawInput API允许我检测使用SendInput API发送的虚假事件。这是对的吗?

1 个答案:

答案 0 :(得分:4)

SetWindowsHookEx()提供的低级键盘/鼠标挂钩报告输入是由实际设备生成还是由应用程序代码注入。

对于low-level keyboard hook,钩子提供指向KBDLLHOOKSTRUCT结构的指针,该结构具有flags成员,该成员包含用于伪输入的LLKHF_INJECTED标志。

对于low-level mouse hook,钩子提供指向MSLLHOOKSTRUCT结构的指针,该结构的flags成员包含LLMHF_INJECTEDLLMHF_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阻止输入。你仍然需要一个低级钩子。