【问题标题】:Detect if keyboard or mouse events are triggered by a software检测键盘或鼠标事件是否由软件触发
【发布时间】:2016-05-24 10:55:48
【问题描述】:

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

我的目的不是防止机器人,而是防止远程访问应用程序。

RawInput API 似乎让我可以检测使用 SendInput API 发送的虚假事件。对吗?

【问题讨论】:

  • 您的横向问题(原始输入)未在您的问题已作为重复项关闭的帖子中讨论。如果您希望它得到回答(如果它还没有在其他地方)尝试只询问它。
  • 重复问题的答案没有涵盖另一种可能的检测途径 - 来自SetWindowsHookEx() do 的低级键盘/鼠标挂钩报告输入是真实的还是模拟的。 AFAIK,原始输入 API
  • @Remy - GetRawInputDeviceInfo 的旧文档有一个关于“hDevice”的注释:“原始输入设备的句柄。[...] 如果应用程序,它也可以为 NULL插入输入数据,例如,通过使用 SendInput。"。可以在例如 XE2 的 api 文档中找到它。这个注释现在从文档中删除了,我不知道为什么,但GetRawInputDeviceInfo 通常应该能够分辨出来。
  • 我重新打开了这个问题。标记副本中的 cmets 和答案,不知何故,在我看来,他们都以一种相当迂回的方式解决了这个问题。

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


【解决方案1】:

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

对于low-level keyboard hook,钩子提供了一个指向KBDLLHOOKSTRUCT 结构的指针,该结构有一个flags 成员,其中包含一个LLKHF_INJECTED 标志用于虚假输入。

对于low-level mouse hook,挂钩提供指向MSLLHOOKSTRUCT 结构的指针,该结构有一个flags 成员,其中包含LLMHF_INJECTEDLLMHF_LOWER_IL_INJECTED 标志,用于假输入。

任何一个钩子都可以返回一个非零值来阻止输入传递到钩子链的其余部分,从而阻止传递到目标窗口。

关于原始输入 API,根据 (an older version of 1) GetRawInputDeviceInfo() 函数的文档:

hDevice [输入,可选]
类型:手柄

原始输入设备的句柄。这来自 WM_INPUT 消息的 lParam、来自 RAWINPUTHEADER 的 hDevice 成员或来自 GetRawInputDeviceList。 如果应用程序插入输入数据,例如使用 SendInput,它也可以为 NULL。

1:当前版本的文档中,高亮的注释已经被删除了,不知道为什么。

因此,WM_INPUT 消息报告的 hDevice 对于虚假输入将为 NULL。

但是,无法使用原始输入 API 阻止输入。你仍然需要一个低级的钩子。

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多