【问题标题】:How to tell real and virtual keypresses apart?如何区分真实和虚拟按键?
【发布时间】:2012-05-17 02:04:12
【问题描述】:

我正在开发一个 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 可能是一种选择,但我很警惕在那里运行的自定义脚本解释器对性能的影响。)

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    事实证明,虚拟键/鼠标事件的正确术语是“injected”,并且低级键盘挂钩确实在 KBDLLHOOKSTRUCT 中提供了相关标志。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-21
      • 2023-03-22
      • 2015-03-14
      • 2013-05-27
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多