Глобальные горячие клавиши в WPF, работающие из каждого windows

Я должен использовать горячие клавиши, которые будут работать из каждого windows и кафедры. В 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 формы)
    • не используйте перечисление Key из WPF – это не те, которые вы хотите

    Полный код:

     [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 } 
    Давайте будем гением компьютера.