在应用程序未聚焦时侦听密钥

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

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

如果用户在应用程序不是当前窗口时按下此键/或未聚焦,我怎么知道我的应用程序?

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

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

    此代码注入对防病毒软件也会产生怀疑,这可能会阻止它。

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

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

    如果CPU优先级高于您的应用程序的应用程序使其耗费CPU时间,那么这一点尤其糟糕。 在这种情况下,延迟可以达到几秒钟,将许多按键聚集在一起。 有些(写得不好)的游戏会像这样工作,在这种情况下变得无法播放。

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

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

正如您计划的那样,使用简单的F-Key作为全局热键是有问题的,因为它经常与具有焦点的应用程序的本地热键发生冲突。 因此,您应该使全局热键可配置,以便用户可以避免与常用应用程序发生冲突。