在应用程序未聚焦时侦听密钥
我有一个应用程序(C#4.0-WPF),它是隐藏的,可以通过单击系统托盘图标或我创建的其他框架(左边和最顶部停靠的小框架)显示。
我的客户希望添加一种新的方式来显示应用程序:当按下“F”键时(例如F9 )。
如果用户在应用程序不是当前窗口时按下此键/或未聚焦,我怎么知道我的应用程序?
如果您只需要一些全局热键,则全局键盘挂钩不是正确的解决方案。
-
使用
WH_KEYBOARD
全局键盘钩子意味着您的dll将被注入到接收按键的每个进程中。 它不应该在托管代码中使用,因为CLR相对较重并且可能导致版本冲突。此代码注入对防病毒软件也会产生怀疑,这可能会阻止它。
-
使用
WH_KEYBOARD_LL
低级键盘钩子是托管代码的更好选择,因为它处理您自己的应用程序中的键盘事件。 仍然需要每个键盘事件都由您的线程处理。这会增加按下按键和接收按键的目标应用程序之间的时间。
如果CPU优先级高于您的应用程序的应用程序使其耗费CPU时间,那么这一点尤其糟糕。 在这种情况下,延迟可以达到几秒钟,将许多按键聚集在一起。 有些(写得不好)的游戏会像这样工作,在这种情况下变得无法播放。
-
Windows API函数
RegisterHotKey
是用于全局热键的正确函数。Windows将为您进行过滤,并且仅在已按下其中一个已注册的密钥时通知您的应用程序,因此您不必处理所有这些密钥。
正如您计划的那样,使用简单的F-Key作为全局热键是有问题的,因为它经常与具有焦点的应用程序的本地热键发生冲突。 因此,您应该使全局热键可配置,以便用户可以避免与常用应用程序发生冲突。