HotKey.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.InteropServices;
  4. using System.Windows;
  5. using System.Windows.Input;
  6. using System.Windows.Interop;
  7. namespace GeekDesk.Util
  8. {
  9. class Hotkey
  10. {
  11. #region 系统api
  12. [DllImport("user32.dll")]
  13. [return: MarshalAs(UnmanagedType.Bool)]
  14. static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, uint vk);
  15. [DllImport("user32.dll")]
  16. static extern bool UnregisterHotKey(IntPtr hWnd, int id);
  17. #endregion
  18. /// <summary>
  19. /// 注册快捷键
  20. /// </summary>
  21. /// <param name="window">持有快捷键窗口</param>
  22. /// <param name="fsModifiers">组合键</param>
  23. /// <param name="key">快捷键</param>
  24. /// <param name="callBack">回调函数</param>
  25. public static bool Regist(Window window, HotkeyModifiers fsModifiers, Key key, HotKeyCallBackHanlder callBack)
  26. {
  27. var hwnd = new WindowInteropHelper(window).Handle;
  28. var _hwndSource = HwndSource.FromHwnd(hwnd);
  29. _hwndSource.AddHook(WndProc);
  30. int id = keyid++;
  31. var vk = KeyInterop.VirtualKeyFromKey(key);
  32. keymap[id] = callBack;
  33. return RegisterHotKey(hwnd, id, fsModifiers, (uint)vk);
  34. }
  35. /// <summary>
  36. /// 快捷键消息处理
  37. /// </summary>
  38. static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
  39. {
  40. if (msg == WM_HOTKEY)
  41. {
  42. int id = wParam.ToInt32();
  43. if (keymap.TryGetValue(id, out var callback))
  44. {
  45. callback();
  46. }
  47. }
  48. return IntPtr.Zero;
  49. }
  50. /// <summary>
  51. /// 注销快捷键
  52. /// </summary>
  53. /// <param name="hWnd">持有快捷键窗口的句柄</param>
  54. /// <param name="callBack">回调函数</param>
  55. public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
  56. {
  57. foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
  58. {
  59. if (var.Value == callBack)
  60. UnregisterHotKey(hWnd, var.Key);
  61. }
  62. }
  63. const int WM_HOTKEY = 0x312;
  64. static int keyid = 10;
  65. static Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();
  66. public delegate void HotKeyCallBackHanlder();
  67. }
  68. enum HotkeyModifiers
  69. {
  70. MOD_ALT = 0x1,
  71. MOD_CONTROL = 0x2,
  72. MOD_SHIFT = 0x4,
  73. MOD_WIN = 0x8
  74. }
  75. }