WPF中的全局热键在每个窗口中工作

我必须使用热键,它将在每个窗口和讲坛上工作。 在winforms我用过:

RegisterHotKey(this.Handle, 9000, 0x0002, (int)Keys.F10); 

 UnregisterHotKey(this.Handle, 9000); 

 protected override void WndProc(ref Message m) { base.WndProc(ref m); switch (m.Msg) { case 0x312: switch (m.WParam.ToInt32()) { case 9000: //function to do break; } break; } } 

在我的WPF应用程序中,我试过:

 AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent); 

 private void HandleKeyDownEvent(object sender, KeyEventArgs e) { if (e.Key == Key.F11 && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) { //function to do } } 

但它仅在我的应用程序处于活动状态且位于顶部时才起作用,但在应用程序最小化时(例如)它不起作用。 有什么方法可以做到吗?

您可以使用与WinForms中相同的方法进行一些调整:

  • 使用WindowInteropHelper获取HWND (而不是表单的Handle属性)
  • 使用HwndSource处理窗口消息(而不是覆盖窗体的WndProc
  • 不要使用WPF Key枚举 – 它的值不是您想要的值

完整代码:

 [DllImport("User32.dll")] private static extern bool RegisterHotKey( [In] IntPtr hWnd, [In] int id, [In] uint fsModifiers, [In] uint vk); [DllImport("User32.dll")] private static extern bool UnregisterHotKey( [In] IntPtr hWnd, [In] int id); private HwndSource _source; private const int HOTKEY_ID = 9000; protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); var helper = new WindowInteropHelper(this); _source = HwndSource.FromHwnd(helper.Handle); _source.AddHook(HwndHook); RegisterHotKey(); } protected override void OnClosed(EventArgs e) { _source.RemoveHook(HwndHook); _source = null; UnregisterHotKey(); base.OnClosed(e); } private void RegisterHotKey() { var helper = new WindowInteropHelper(this); const uint VK_F10 = 0x79; const uint MOD_CTRL = 0x0002; if(!RegisterHotKey(helper.Handle, HOTKEY_ID, MOD_CTRL, VK_F10)) { // handle error } } private void UnregisterHotKey() { var helper = new WindowInteropHelper(this); UnregisterHotKey(helper.Handle, HOTKEY_ID); } private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { const int WM_HOTKEY = 0x0312; switch(msg) { case WM_HOTKEY: switch(wParam.ToInt32()) { case HOTKEY_ID: OnHotKeyPressed(); handled = true; break; } break; } return IntPtr.Zero; } private void OnHotKeyPressed() { // do stuff }