2012-07-07 14 views
9

Tengo que usar teclas de acceso rápido que funcionarán desde todas las ventanas y el púlpito. En winforms utilicé:Teclas de acceso rápido globales en WPF que funcionan desde todas las ventanas

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

y

UnregisterHotKey(this.Handle, 9000); 

y

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

En mi Aplicación WPF Intenté hacer:

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

y

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

Pero funciona solo cuando mi aplicación está activa y en la parte superior, pero no funciona cuando la aplicación está minimizada (por ejemplo). ¿Hay algún método para hacerlo?

Respuesta

20

Usted puede utilizar el mismo enfoque que en WinForms con alguna adaptación:

  • uso WindowInteropHelper para obtener HWND (en lugar de Handle propiedad de un formulario)
  • uso HwndSource para manejar mensajes de ventana (en lugar de anular WndProc de un formulario)
  • no utilizan Key enumeración de WPF - es valores no son los que usted quiere

Código completo:

[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

Está funcionando, gracias mucho – cadi2108

Cuestiones relacionadas