如何区分真实和虚拟按键?

时间:2012-05-16 08:47:41

标签: c# wpf

我正在开发一个监视键盘和鼠标事件的C#应用​​程序,如果发生按键或鼠标按键的预设组合,则会做出反应。 热键检测已经通过键盘和鼠标挂钩工作。但是,当应用程序的答案是使用SendInput()发送新的密钥组合时,我遇到了麻烦。

假设应用程序等待“ Alt + RMB ”m抑制它并发送“ Shift + A ”。当我开始按下“ Alt + RMB ”时,会检测到组合并发送虚拟“ Shift + A ”。

然而,假按键会立即与原始按键混合,因此应用程序现在会检测到“ Alt + Shift + A + RMB ”组合,而不是“ Alt + RMB “不再如此” Shift + A “停止发送。虚拟按键清除系统后,再次检测到真正的热键按下,循环重新开始。 (“ A ”需要替换为“ B ”的设置,而“ B ”则设置为“ A ”会导致无限循环。)

所以似乎我的主要问题是分开真实和虚拟的键/鼠事件。有什么建议吗?

(是的,任务确实类似于Autohotkey。但是我在热键检测和可选的虚拟输入发送步骤之间有自定义业务逻辑。使用Autohotkey.dll可能是一个选项,但我我担心在那里运行的自定义脚本解释器对性能的影响。)

1 个答案:

答案 0 :(得分:0)

事实证明,虚拟键/鼠标事件的正确术语是“注入”,而低级键盘钩确实在KBDLLHOOKSTRUCT中提供相关标记。

现在我修改了与钩子相关的事件管理,因此它允许任何带有“LLKHF_INJECTED”标志的事件,而不会抑制或通知主要逻辑。