Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当应用程序未聚焦时,侦听密钥_C#_.net_Wpf_Keyboard Shortcuts_Shortcut - Fatal编程技术网

C# 当应用程序未聚焦时,侦听密钥

C# 当应用程序未聚焦时,侦听密钥,c#,.net,wpf,keyboard-shortcuts,shortcut,C#,.net,Wpf,Keyboard Shortcuts,Shortcut,我有一个应用程序(C#4.0-WPF),它是隐藏的,可以通过单击systray图标或我创建的其他框架(停靠在最左侧和最顶部的小框架)来显示 我的客户希望添加一种显示应用程序的新方式:按“F”键(例如F9)时 在我的应用程序中,如何知道当应用程序不是当前窗口或未聚焦时用户是否按下此键?如果您只需要几个全局热键,则全局键盘挂钩不是正确的解决方案 使用WH_-keyboard的全局键盘钩子意味着您的dll将被注入到每个接收按键的进程中。在托管代码中根本不应该使用CLR,因为CLR相对较重,可能会导致

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

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


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

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

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

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

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

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

    如果CPU优先级高于应用程序的应用程序耗尽了CPU时间,则这种情况尤其糟糕。在这种情况下,延迟可以达到几秒钟,将多个按键集中在一起。有些(写得不好的)游戏就是这样工作的,在这种情况下无法运行

  • windows API函数是用于全局热键的合适函数

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

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