• c# HookProc 钩子


    1. using System;
    2. using System.Diagnostics;
    3. using System.Runtime.InteropServices;
    4. using System.Windows.Forms;
    5. public class LocalKeyboardHook
    6. {
    7. // 定义钩子委托
    8. private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
    9. // 钩子类型
    10. private const int WH_KEYBOARD_LL = 13;
    11. // 声明钩子的函数
    12. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    13. private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
    14. // 声明卸载钩子的函数
    15. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    16. [return: MarshalAs(UnmanagedType.Bool)]
    17. private static extern bool UnhookWindowsHookEx(IntPtr hhk);
    18. // 声明调用下一个钩子的函数
    19. [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    20. private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
    21. private const int WM_KEYDOWN = 0x0100;
    22. private const int WM_KEYUP = 0x0101;
    23. private HookProc hookDelegate;
    24. private IntPtr hookId = IntPtr.Zero;
    25. public event KeyEventHandler KeyDown;
    26. public event KeyEventHandler KeyUp;
    27. public LocalKeyboardHook()
    28. {
    29. hookDelegate = HookCallback;
    30. hookId = SetHook(hookDelegate);
    31. }
    32. public void Dispose()
    33. {
    34. UnhookWindowsHookEx(hookId);
    35. }
    36. private IntPtr SetHook(HookProc proc)
    37. {
    38. using (Process curProcess = Process.GetCurrentProcess())
    39. using (ProcessModule curModule = curProcess.MainModule)
    40. {
    41. return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
    42. }
    43. }
    44. private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    45. {
    46. if (nCode >= 0)
    47. {
    48. if (wParam == (IntPtr)WM_KEYDOWN)
    49. {
    50. KeyEventArgs keyEventArgs = CreateKeyEventArgs(lParam);
    51. KeyDown?.Invoke(this, keyEventArgs);
    52. }
    53. else if (wParam == (IntPtr)WM_KEYUP)
    54. {
    55. KeyEventArgs keyEventArgs = CreateKeyEventArgs(lParam);
    56. KeyUp?.Invoke(this, keyEventArgs);
    57. }
    58. }
    59. return CallNextHookEx(hookId, nCode, wParam, lParam);
    60. }
    61. private KeyEventArgs CreateKeyEventArgs(IntPtr lParam)
    62. {
    63. int keyCode = Marshal.ReadInt32(lParam);
    64. Keys key = (Keys)keyCode;
    65. int keyData = (int)key;
    66. int scanCode = (int)((uint)lParam >> 16 & 0xFF);
    67. int flags = (int)((uint)lParam >> 24);
    68. return new KeyEventArgs(keyData | (scanCode << 16) | (flags << 24));
    69. }
    70. [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    71. private static extern IntPtr GetModuleHandle(string lpModuleName);
    72. }

    调用

    1. using System;
    2. using System.Windows.Forms;
    3. public partial class MainForm : Form
    4. {
    5. private LocalKeyboardHook keyboardHook;
    6. public MainForm()
    7. {
    8. InitializeComponent();
    9. keyboardHook = new LocalKeyboardHook();
    10. keyboardHook.KeyDown += KeyboardHook_KeyDown;
    11. }
    12. private void KeyboardHook_KeyDown(object sender, KeyEventArgs e)
    13. {
    14. // 处理键盘按键按下事件
    15. MessageBox.Show($"Key Down: {e.KeyCode}");
    16. }
    17. protected override void OnFormClosing(FormClosingEventArgs e)
    18. {
    19. // 清理资源
    20. keyboardHook.Dispose();
    21. base.OnFormClosing(e);
    22. }
    23. }

  • 相关阅读:
    答网友提问 - SAP Business Technology Platform(BTP) 的计费模式
    Jenkins用户权限配置 (三)
    2023年无人航空系统与航空航天国际会议(ICUASA 2023)
    C++智能指针简介
    04-SpringBoot集成Nebula Graph
    应用层协议 HTTP
    如何搭建一个好的知识库管理系统?
    【深度学习】You Only Segment Once: Towards Real-Time Panoptic Segmentation,YOSO全景分割
    函数对象类,函数对象(又称仿函数)
    网络安全(黑客)自学
  • 原文地址:https://blog.csdn.net/nbspzs/article/details/132779654