KeyBoardHook.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Diagnostics;
  7. using System.Runtime.InteropServices;
  8. using System.Windows.Forms;
  9. using PTMedicalInsurance.Forms;
  10. namespace PTMedicalInsurance.Business
  11. {
  12. class KeyBoardHook
  13. {
  14. public class KeyboardHook
  15. {
  16. private static LowLevelKeyboardProc _proc = HookCallback;
  17. private static IntPtr _hookID = IntPtr.Zero;
  18. public static void Start()
  19. {
  20. _hookID = SetHook(_proc);
  21. }
  22. public static void Stop()
  23. {
  24. UnhookWindowsHookEx(_hookID);
  25. }
  26. private static IntPtr SetHook(LowLevelKeyboardProc proc)
  27. {
  28. using (Process curProcess = Process.GetCurrentProcess())
  29. using (ProcessModule curModule = curProcess.MainModule)
  30. {
  31. return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
  32. GetModuleHandle(curModule.ModuleName), 0);
  33. }
  34. }
  35. private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
  36. private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
  37. {
  38. if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
  39. {
  40. int vkCode = Marshal.ReadInt32(lParam);
  41. if (vkCode == (int)Keys.F12) // 使用F12键触发密码键盘
  42. {
  43. IntPtr foregroundWindow = GetForegroundWindow();
  44. StringBuilder windowTitle = new StringBuilder(256);
  45. GetWindowText(foregroundWindow, windowTitle, windowTitle.Capacity);
  46. // 检测目标程序的窗口
  47. if (windowTitle.ToString().Contains("目标程序标题"))
  48. {
  49. IntPtr focusedHandle = GetFocusedControl();
  50. if (focusedHandle != IntPtr.Zero)
  51. {
  52. ShowPasswordKeyboard(focusedHandle);
  53. }
  54. }
  55. }
  56. }
  57. return CallNextHookEx(_hookID, nCode, wParam, lParam);
  58. }
  59. private static void ShowPasswordKeyboard(IntPtr targetHandle)
  60. {
  61. PasswordKeyboardForm passwordKeyboard = new PasswordKeyboardForm(targetHandle);
  62. passwordKeyboard.ShowDialog();
  63. }
  64. private const int WH_KEYBOARD_LL = 13;
  65. private const int WM_KEYDOWN = 0x0100;
  66. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  67. private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
  68. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  69. [return: MarshalAs(UnmanagedType.Bool)]
  70. private static extern bool UnhookWindowsHookEx(IntPtr hhk);
  71. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  72. private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
  73. [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  74. private static extern IntPtr GetModuleHandle(string lpModuleName);
  75. [DllImport("user32.dll")]
  76. private static extern IntPtr GetForegroundWindow();
  77. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  78. private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
  79. [DllImport("user32.dll")]
  80. private static extern IntPtr GetFocus();
  81. [DllImport("user32.dll")]
  82. private static extern IntPtr GetFocusedControl();
  83. }
  84. }
  85. }