2012-07-07 12 views
9

Tôi phải sử dụng phím nóng sẽ hoạt động ở mọi cửa sổ và bục giảng. Trong winforms tôi đã sử dụng:Phím nóng toàn cầu trong WPF hoạt động từ mọi cửa sổ

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

trong aplication WPF của tôi, tôi đã cố gắng làm:

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

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

Nhưng nó chỉ hoạt động khi ứng dụng của tôi đang hoạt động và ở trên cùng, nhưng nó không hoạt động khi ứng dụng được thu nhỏ (ví dụ). Có phương pháp nào để làm điều đó không?

Trả lời

20

Bạn có thể sử dụng phương pháp tương tự như trong WinForms với một số thích ứng:

  • sử dụng WindowInteropHelper để có được HWND (thay vì Handle tài sản của một hình thức)
  • sử dụng HwndSource để xử lý các thông điệp cửa sổ (thay vì trọng WndProc của biểu mẫu)
  • không sử dụng Key liệt kê từ WPF - giá trị của nó không phải là giá trị bạn muốn

Mã hoàn chỉnh:

[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

Nó hoạt động, cảm ơn bạn rất nhiều – cadi2108