KeyBoardListenManager.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using System;
  2. using System.Diagnostics;
  3. using System.Runtime.InteropServices;
  4. using System.Windows.Input;
  5. using Vinno.FIS.Sonopost.Managers.Interfaces;
  6. using Vinno.IUS.Common.Log;
  7. namespace Vinno.FIS.Sonopost.Managers
  8. {
  9. internal class KeyBoardListenManager : SonopostManager, IKeyBoardListenManager
  10. {
  11. private const int WH_KEYBOARD_LL = 13;
  12. private const int WM_KEYDOWN = 0x0100;
  13. private const int WM_KEYUP = 0x0101;
  14. private bool _isLeftKeyDown;
  15. private bool _isRightKeyDown;
  16. // 声明全局钩子句柄
  17. private IntPtr _keyboardHookID = IntPtr.Zero;
  18. // 键盘处理委托实例
  19. private LowLevelKeyboardProc _keyboardProc;
  20. // 导入SetWindowsHookEx函数
  21. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  22. private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
  23. // 导入UnhookWindowsHookEx函数
  24. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  25. [return: MarshalAs(UnmanagedType.Bool)]
  26. private static extern bool UnhookWindowsHookEx(IntPtr hhk);
  27. // 导入CallNextHookEx函数
  28. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  29. private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
  30. [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  31. private static extern IntPtr GetModuleHandle(string lpModuleName);
  32. // 声明KeyboardProc委托类型
  33. private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
  34. public Key LeftKey { get; private set; }
  35. public Key RightKey { get; private set; }
  36. public event EventHandler LeftKeyPressedEvent;
  37. public event EventHandler RightKeyPressedEvent;
  38. public void StartKeyBoardListen(Key leftKey, Key rightKey)
  39. {
  40. _keyboardProc = KeyboardHookCallback;
  41. _keyboardHookID = SetKeyboardHook(_keyboardProc);
  42. LeftKey = leftKey;
  43. RightKey = rightKey;
  44. }
  45. private IntPtr SetKeyboardHook(LowLevelKeyboardProc proc)
  46. {
  47. using (Process curProcess = Process.GetCurrentProcess())
  48. using (ProcessModule curModule = curProcess.MainModule)
  49. {
  50. return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
  51. }
  52. }
  53. private void UnsetKeyboardHook()
  54. {
  55. UnhookWindowsHookEx(_keyboardHookID);
  56. }
  57. public void StopKeyBoardListen()
  58. {
  59. UnsetKeyboardHook();
  60. }
  61. public override void DoDispose()
  62. {
  63. try
  64. {
  65. StopKeyBoardListen();
  66. }
  67. catch (Exception ex)
  68. {
  69. Logger.WriteLineError($"KeyBoardListenManager DoDispose Error:{ex}");
  70. }
  71. base.DoDispose();
  72. }
  73. private IntPtr KeyboardHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
  74. {
  75. try
  76. {
  77. if (nCode >= 0)
  78. {
  79. if (wParam == (IntPtr)WM_KEYDOWN)
  80. {
  81. int vkCode = Marshal.ReadInt32(lParam);
  82. var pressedKey = KeyInterop.KeyFromVirtualKey(vkCode);
  83. if (pressedKey == LeftKey && !_isLeftKeyDown)
  84. {
  85. Logger.WriteLineWarn($"LeftKey {pressedKey} Pressed");
  86. _isLeftKeyDown = true;
  87. LeftKeyPressedEvent?.Invoke(this, EventArgs.Empty);
  88. }
  89. else if (pressedKey == RightKey && !_isRightKeyDown)
  90. {
  91. Logger.WriteLineWarn($"RightKey {pressedKey} Pressed");
  92. _isRightKeyDown = true;
  93. RightKeyPressedEvent?.Invoke(this, EventArgs.Empty);
  94. }
  95. }
  96. else if (wParam == (IntPtr)WM_KEYUP)
  97. {
  98. int vkCode = Marshal.ReadInt32(lParam);
  99. var pressedKey = KeyInterop.KeyFromVirtualKey(vkCode);
  100. if (pressedKey == LeftKey)
  101. {
  102. _isLeftKeyDown = false;
  103. }
  104. else if (pressedKey == RightKey)
  105. {
  106. _isRightKeyDown = false;
  107. }
  108. }
  109. }
  110. }
  111. catch (Exception ex)
  112. {
  113. Logger.WriteLineError($"KeyboardHookCallback Error:{ex}");
  114. }
  115. return CallNextHookEx(_keyboardHookID, nCode, wParam, lParam);
  116. }
  117. }
  118. }