【问题标题】:listen for a key when the application is not focused当应用程序没有聚焦时监听一个键
【发布时间】:2011-07-01 06:01:15
【问题描述】:

我有一个应用程序(C# 4.0-WPF),它是隐藏的,可以通过单击系统托盘图标或我创建的其他框架(停靠在左侧和最上方的小框架)来显示。

我的客户想要添加一种显示应用程序的新方式:按下“F”键时(例如 F9)。

当应用程序不是当前窗口/或未获得焦点时,我如何在我的应用程序中知道用户是否按下此键?

【问题讨论】:

    标签: c# .net wpf keyboard-shortcuts shortcut


    【解决方案1】:

    如果您只需要几个全局热键,则全局键盘挂钩不是正确的解决方案。

    • 使用WH_KEYBOARD 的全局键盘挂钩意味着您的 dll 将被注入到每个接收按键的进程中。根本不应该在托管代码中使用它,因为 CLR 相对较重,可能会导致版本冲突。

      这种代码注入对于防病毒软件来说也是可疑的,可能会阻止它。

    • 使用WH_KEYBOARD_LL 的低级键盘挂钩是托管代码的更好选择,因为它在您自己的应用程序中处理键盘事件。它仍然要求每个键盘事件都由您的线程处理。

      这会增加按键与目标应用程序接收按键之间的时间。

      如果 CPU 优先级高于您的应用程序的应用程序占用了 CPU 时间,则情况尤其糟糕。在这种情况下,延迟可能会达到几秒钟,将许多按键组合在一起。一些(写得不好的)游戏就是这样工作的,在这种情况下变得无法玩。

    • Windows API 函数RegisterHotKey 是用于全局热键的正确函数。

      Windows 将为您进行过滤,并且仅在按下其中一个注册键时通知您的应用程序,因此您不必处理所有这些键。

    按照您的计划,使用简单的 F 键作为全局热键是有问题的,因为它经常与具有焦点的应用程序的本地热键发生冲突。所以你应该让全局热键可配置,这样用户就可以避免与他们常用的应用程序发生冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多