C# 滑鼠全域鉤子

來源:互聯網
上載者:User

標籤:eth   class   led   限制   失敗   rtos   cti   停止   hal   

/// <summary>    /// 滑鼠全域鉤子    /// </summary>    public class MouseHook    {        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;        /// <summary>        /// 點        /// </summary>        [StructLayout(LayoutKind.Sequential)]        public class POINT        {            public int x;            public int y;        }        /// <summary>        /// 鉤子結構體        /// </summary>        [StructLayout(LayoutKind.Sequential)]        public class MouseHookStruct        {            public POINT pt;            public int hWnd;            public int wHitTestCode;            public int dwExtraInfo;        }        public const int WH_MOUSE_LL = 14; // mouse hook constant        // 裝置鉤子的函數        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]        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", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]        public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);        // 全域的滑鼠事件        public event MouseEventHandler OnMouseActivity;        // 鉤子回呼函數        public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);        // 聲明滑鼠鉤子事件類型        private HookProc   _mouseHookProcedure;         private static int _hMouseHook = 0; // 滑鼠鉤子控制代碼                /// <summary>        /// 建構函式        /// </summary>        public MouseHook()        {        }                /// <summary>        /// 解構函式        /// </summary>        ~MouseHook()        {            Stop();        }        /// <summary>        /// 啟動全域鉤子        /// </summary>        public void Start()        {            // 安裝滑鼠鉤子            if (_hMouseHook == 0)            {                // 產生一個HookProc的執行個體.                _mouseHookProcedure = new HookProc(MouseHookProc);                _hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, _mouseHookProcedure, Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]), 0);                //假設裝置失敗停止鉤子                if (_hMouseHook == 0)                {                    Stop();                    throw new Exception("SetWindowsHookEx failed.");                }            }        }        /// <summary>        /// 停止全域鉤子        /// </summary>        public void Stop()        {            bool retMouse = true;            if (_hMouseHook != 0)            {                retMouse    = UnhookWindowsHookEx(_hMouseHook);                _hMouseHook = 0;            }            // 假設卸下鉤子失敗            if (!(retMouse))                 throw new Exception("UnhookWindowsHookEx failed.");        }        /// <summary>        /// 滑鼠鉤子回呼函數        /// </summary>        private int MouseHookProc(int nCode, Int32 wParam, IntPtr lParam)        {            // 假設正常執行而且使用者要監聽滑鼠的訊息            if ((nCode >= 0) && (OnMouseActivity != null))            {                MouseButtons button = MouseButtons.None;                int clickCount = 0;                switch (wParam)                {                    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;                }                // 從回呼函數中得到滑鼠的資訊                MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));                MouseEventArgs e = new MouseEventArgs(button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0);                // 假設想要限制滑鼠在螢幕中的移動地區能夠在此處設定                // 後期須要考慮實際的x、y的容差                if(!Screen.PrimaryScreen.Bounds.Contains(e.X, e.Y))                {                    //return 1;                }                OnMouseActivity(this, e);            }            // 啟動下一次鉤子            return CallNextHookEx(_hMouseHook, nCode, wParam, lParam);        }    }

C# 滑鼠全域鉤子

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.