2012-07-07 3 views
9

Muszę używać skrótów klawiszowych, które będą działać z każdego okna i ambony. W WinForms użyłem:Globalne skróty w WPF działające z każdego okna

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

i

UnregisterHotKey(this.Handle, 9000); 

i

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; 
    } 
} 

w moim WPF INFORMACYJNA próbowałem zrobić:

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

i

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

Ale działa tylko wtedy, gdy moja aplikacja jest aktywna i na górze, ale nie działa, gdy aplikacja jest zminimalizowana (na przykład). Czy jest jakaś metoda?

Odpowiedz

20

Można użyć tego samego podejścia jak w WinForms z pewnymi zmianami:

  • użytku WindowInteropHelper dostać HWND (zamiast Handle własności formularza)
  • użytku HwndSource do obsługi wiadomości okienne (zamiast przesłanianie WndProc formularza)
  • nie wykorzystać Key wyliczanie od WPF - to wartości nie są te, które chcą

Kompletny kod:

[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 
} 
+0

To działa, dziękuję dużo – cadi2108

Powiązane problemy