在应用程序未集中时监听密钥

J4N*_*J4N 10 .net c# wpf keyboard-shortcuts shortcut

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

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

如果用户在应用程序不是当前窗口或未关注时按下此键,我如何知道我的应用程序?

Cod*_*aos 18

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

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

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

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

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

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

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

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

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