C# 最简单的全局键盘鼠标钩子
发布时间:2025-12-09 21:42:42
浏览次数:4
//使用方式//1.在窗口 新建按钮(开始hook) 点击事件中执行Hook_Start//2.在窗口 新建按钮(关闭hook) 点击事件中执行Hook_Clear//3.在KeyBoardHookProc 中编写hook到键盘要进行的操作//4.在MouseHookProc 中编写hook到鼠标要进行的操作//一些依赖项[DllImport("user32.dll")]public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook);[DllImport("user32.dll")]public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);[DllImport("kernel32.dll")]public static extern int GetCurrentThreadId();[DllImport("kernel32.dll")]public static extern IntPtr GetModuleHandle(string name);[DllImport("User32.dll")]public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo);//鼠标事件映射private const int WM_MOUSEMOVE = 0x200;private const int WM_LBUTTONDOWN = 0x201;private const int WM_RBUTTONDOWN = 0x204;private const int WM_MBUTTONDOWN = 0x207;private const int WM_LBUTTONUP = 0x202;private const int WM_RBUTTONUP = 0x205;private const int WM_MBUTTONUP = 0x208;private const int WM_LBUTTONDBLCLK = 0x203;private const int WM_RBUTTONDBLCLK = 0x206;private const int WM_MBUTTONDBLCLK = 0x209;//鼠标hookpublic const int WH_MOUSE_LL = 14;//键盘hookpublic const int WH_KEYBOARD_LL = 13;public delegate int HookProc(int nCode, int wParam, IntPtr lParam);//回调HookProc KeyBoardHookProcedure;HookProc _mouseHookProcedure;//hook到的消息结构[StructLayout(LayoutKind.Sequential)]public class KeyBoardHookStruct{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}[StructLayout(LayoutKind.Sequential)]public class MouseHookStruct{public POINT pt;public int hWnd;public int wHitTestCode;public int dwExtraInfo;}//开启hookpublic void Hook_Start(){KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure,GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);_mouseHookProcedure = new HookProc(MouseHookProc);_hMouseHook = SetWindowsHookEx(WH_MOUSE_LL,_mouseHookProcedure, Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]), 0);}//关闭hook public void Hook_Clear(){bool retKeyboard = true;bool retMouse = true;retKeyboard = UnhookWindowsHookEx(hHook);hHook = 0;retMouse = UnhookWindowsHookEx(_hMouseHook);_hMouseHook = 0;}//键盘hook到之后的操作private int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam){if (nCode >= 0){KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));if (kbh.vkCode == (int)Keys.D && wParam==256) //D{//如果按下了D 要进行的处理}}return CallNextHookEx(hHook, nCode, wParam, lParam);}//鼠标hook到之后的操作private int MouseHookProc(int nCode, Int32 wParam, IntPtr lParam){MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));int x = MyMouseHookStruct.pt.x;int y = MyMouseHookStruct.pt.y;if ( wParam== WM_LBUTTONDOWN){//鼠标左键按下要进行的处理} return CallNextHookEx(_hMouseHook, nCode, wParam, lParam);}