【问题标题】:C# WPF catch keydown even when minimized即使最小化,C# WPF 也会捕获 keydown
【发布时间】:2015-05-01 08:43:40
【问题描述】:

我想知道如何让我的应用程序即使在最小化申请表时也能捕捉到任何 keydown/keyup。说,程序被最小化,然后用户按“A”,将出现一个弹出控件。请注意,我的程序有效,但最小化时无效。谢谢。

【问题讨论】:

  • 您想在您的应用获得焦点时捕捉到“A”,或者您想要一个全局快捷方式来“激活”您的应用?
  • 嗨,非常感谢您的回复,我想要的是让我的表单始终保持焦点,即使它被最小化。因为当我运行我的程序时,我点击了程序表单之外的任何地方,当然它不起作用。就像WordWeb软件(一个词典软件)一样,即使是这样的软件也被最小化到尝试,当你按下CTRL+ALT+W时,软件就会弹出。类似的东西。
  • stackoverflow.com/a/11378213/613130。你把这段代码放在你的 MainWindow 中,它就可以工作了。
  • 你好 xanatos,请看我对下面答案的回复。请。非常感谢您提供的链接,但请再次查看我的回复。

标签: c# wpf


【解决方案1】:

您需要的是热键。没有内置的 .NET 功能允许这样做,但它内置于 Win32 API。

所以你需要两个方法RegisterHotKeyUnregisterHotKey,它们在user32.dllSystem.Runtime.InteropServices命名空间中,其中包含重要的DllImportAttribute,我们需要调用上面两个Win32 API函数来注册热键。

这里有两个链接,其中包含使用热键的良好演示。

1)Global Hotkeys: Register a hotkey that is triggered even when form isn't focused,

2)Simple steps to enable Hotkey and ShortcutInput user control

您必须使用这些修饰符和Virtual-Key Codes(系统使用的虚拟键代码的符号常量名称、十六进制值和鼠标或键盘等效项。):

MOD_ALT      (0x0001)
MOD_CONTROL  (0x0002)
MOD_NOREPEAT (0x4000)
MOD_SHIFT    (0x0004)
MOD_WIN      (0x0008)

例如 A 是 0x41。

【讨论】:

  • 嗨,我已经将您的答案标记为“答案”。但是,如果没有 CTRL,您的第一个给定链接中的代码将无法工作。 “[In] uint fsModifiers”是必要的,每当我尝试删除它时,它都会给我一个错误,BREAK OR CONTINUE,blabla bla。我真正想要的是让我的程序即使在最小化时也能捕捉/检测 NUMLOCK 按钮。我使用此代码来判断是否激活了 numlock:if (Console.NumberLock== true)
  • @user3231194 对于 fsModifiers 传递 0(零)
  • 我无法清楚地理解您的问题。第二个链接呢?
  • @xanatos - 好的,谢谢。今晚晚些时候我会试试你的答案。对于 Ustave 爵士来说,第一个和第二个链接的作用是一样的,对吧?好的,这就是我的小项目的概念。当我的程序被最小化时,它仍然会检测用户是否按下了NUMLOCK,然后程序会弹出一条消息,说明numlock的当前状态(开还是关?)。而已!将来,即使它在托盘中,我也会让我的程序正常工作。代码 (Console.NumberLock == true) 仅在表单被聚焦时有效。
  • 好的,标记为已解决 :) 感谢 Xanatos 的评论。我让我的 fsModifiers = 0; :) :) :) 酷!!!
猜你喜欢
  • 2011-01-24
  • 2018-10-28
  • 1970-01-01
  • 2012-09-17
  • 2023-03-12
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多