【问题标题】:Best way to tackle global hotkey processing in c#? [duplicate]在 c# 中处理全局热键的最佳方法是什么? [复制]
【发布时间】:2010-09-10 00:24:33
【问题描述】:

可能重复:
How can I register a global hot key to say CTRL+SHIFT+(LETTER) using WPF and .NET 3.5?

我想在我的新应用程序中使用多个全局热键(以便从 Windows 中的任何位置控制应用程序),并且我在网络上找到的所有给定资源/解决方案似乎都提供了一种跛行的解决方案(要么只针对一个 g.hotkey 的解决方案,要么在运行时在屏幕上产生恼人的鼠标延迟)。

这里有没有人知道可以帮助我实现这一目标的资源,我可以从中学习? 有什么事吗?

谢谢! :)

【问题讨论】:

标签: c# global hotkeys


【解决方案1】:

我找到的最好的解决方案是http://bloggablea.wordpress.com/2007/05/01/global-hotkeys-with-net/

Hotkey hk = new Hotkey();

hk.KeyCode = Keys.1;
hk.Windows = true;
hk.Pressed += delegate { Console.WriteLine("Windows+1 pressed!"); };

hk.Register(myForm); 

注意如何为不同的热键设置不同的 lambdas

【讨论】:

  • 是否可以让这个类使用鼠标按钮(Keys.LButton 和 Keys.RButton)?我尝试过使用相同的类,但只能使用键盘键。
【解决方案2】:

http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx

如果您使用的不是 .net 3.5。

【讨论】:

  • -1 键盘挂钩不是全局热键的好选择。
  • 没有其他内容符合规范:“从 Windows 中的任何位置控制应用程序”,因此请提供更好的见解 [原文如此] 或删除您的评论。
  • RegisterHotKey 无论哪个窗口有焦点都有效,因此符合规范。
  • 没有升高的窗户,只需向下滚动到 cmets 好吗?更不用说当前活动的窗口可能会覆盖相同的热键,从而使您的“哦,所以”全局热键无用。
  • 不幸的是,虽然它有效,但它取消了其他应用程序的键输入。所以注册“a”意味着其他应用将无法使用“a”。
【解决方案3】:

我将通过使用 P/Invoke 为每个热键调用 RegisterHotKey() 来处理这个问题,然后使用 NativeForm(假设您使用 WinForms)来接收 WM_HOTKEY 消息的通知。这应该将您的大部分热键代码保存在一个位置。

【讨论】:

  • 你能举个简单的例子吗?
  • 您使用的是 WinForms 还是 WPF?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多