// *********************************************************************** // Assembly : HZH_Controls // Created : 08-08-2019 // // *********************************************************************** // // Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com // // // Blog: https://www.cnblogs.com/bfyx // GitHub:https://github.com/kwwwvagaa/NetWinformControl // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git // // If you use this code, please keep this note. // *********************************************************************** using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace HZH_Controls { /// /// 鼠标全局钩子 /// public static class MouseHook { /// /// The wm mousemove /// private const int WM_MOUSEMOVE = 0x200; /// /// The wm lbuttondown /// private const int WM_LBUTTONDOWN = 0x201; /// /// The wm rbuttondown /// private const int WM_RBUTTONDOWN = 0x204; /// /// The wm mbuttondown /// private const int WM_MBUTTONDOWN = 0x207; /// /// The wm lbuttonup /// private const int WM_LBUTTONUP = 0x202; /// /// The wm rbuttonup /// private const int WM_RBUTTONUP = 0x205; /// /// The wm mbuttonup /// private const int WM_MBUTTONUP = 0x208; /// /// The wm lbuttondblclk /// private const int WM_LBUTTONDBLCLK = 0x203; /// /// The wm rbuttondblclk /// private const int WM_RBUTTONDBLCLK = 0x206; /// /// The wm mbuttondblclk /// private const int WM_MBUTTONDBLCLK = 0x209; /// /// 点 /// [StructLayout(LayoutKind.Sequential)] public class POINT { /// /// The x /// public int x; /// /// The y /// public int y; } /// /// 钩子结构体 /// [StructLayout(LayoutKind.Sequential)] public class MouseHookStruct { /// /// The pt /// public POINT pt; /// /// The h WND /// public int hWnd; /// /// The w hit test code /// public int wHitTestCode; /// /// The dw extra information /// public int dwExtraInfo; } // 全局的鼠标事件 /// /// Occurs when [on mouse activity]. /// public static event MouseEventHandler OnMouseActivity; /// /// The h mouse hook /// private static int _hMouseHook = 0; // 鼠标钩子句柄 /// /// 启动全局钩子 /// /// SetWindowsHookEx failed. /// SetWindowsHookEx failed. public static void Start() { // 安装鼠标钩子 if (_hMouseHook != 0) { Stop(); } // 生成一个HookProc的实例. WindowsHook.HookMsgChanged += WindowsHook_HookMsgChanged; _hMouseHook = WindowsHook.StartHook(HookType.WH_MOUSE_LL); //假设装置失败停止钩子 if (_hMouseHook == 0) { Stop(); } } static void WindowsHook_HookMsgChanged(string strHookName, int nCode, IntPtr msg, IntPtr lParam) { // 假设正常执行而且用户要监听鼠标的消息 if (nCode >= 0 && OnMouseActivity != null) { MouseButtons button = MouseButtons.None; int clickCount = 0; switch ((int)msg) { case WM_LBUTTONDOWN: button = MouseButtons.Left; clickCount = 1; break; case WM_LBUTTONUP: button = MouseButtons.Left; clickCount = 1; break; case WM_LBUTTONDBLCLK: button = MouseButtons.Left; clickCount = 2; break; case WM_RBUTTONDOWN: button = MouseButtons.Right; clickCount = 1; break; case WM_RBUTTONUP: button = MouseButtons.Right; clickCount = 1; break; case WM_RBUTTONDBLCLK: button = MouseButtons.Right; clickCount = 2; break; } if (button != MouseButtons.None && clickCount > 0) { // 从回调函数中得到鼠标的信息 MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct)); MouseEventArgs e = new MouseEventArgs(button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0); OnMouseActivity(null, e); } } } /// /// 停止全局钩子 /// /// UnhookWindowsHookEx failed. /// UnhookWindowsHookEx failed. public static void Stop() { bool retMouse = true; if (_hMouseHook != 0) { retMouse = WindowsHook.StopHook(_hMouseHook); _hMouseHook = 0; } // 假设卸下钩子失败 if (!(retMouse)) throw new Exception("UnhookWindowsHookEx failed."); } } }