溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#鼠標(biāo)鉤子   帶你走出Form的區(qū)域限制

發(fā)布時(shí)間:2020-07-23 09:08:29 來源:網(wǎng)絡(luò) 閱讀:2820 作者:tb612443 欄目:軟件技術(shù)

記一次鼠標(biāo)鉤子的使用

       惰性啊,好久沒寫東西了,但是今天這東西太重要,所以決心記下來,后續(xù)可以看看。

       鼠標(biāo)鉤子(MouseHock),很少使用的一個(gè)功能,偶爾要用了也會(huì)因?yàn)楦鞣N涉及操作系統(tǒng)底層的接口讓我這種水貨避而遠(yuǎn)之,話又說回來了,興趣是最好的老師,這次我Get了這個(gè)技能,但由于這個(gè)功能太過于強(qiáng)大,屬于非托管資源,用完請(qǐng)立即釋放鉤子,否則你QQ回車發(fā)送的東西能傳到你調(diào)試的XXXAPI你信不。。。

       顧名思義,圍繞著鼠標(biāo)的操作而進(jìn)行的,提前附上鼠標(biāo)的相關(guān)Intptr值:

        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;  十六進(jìn)制的值,注意和十進(jìn)制之間的轉(zhuǎn)換


  1. 鉤子源碼網(wǎng)上很多就不敲了,使用過程簡(jiǎn)單說一下:

  2. 創(chuàng)建對(duì)象

  3. 安裝鉤子

  4. 綁定事件

  5. 卸載鉤子(釋放資源)

鉤子里有這樣一段代碼,說下用的時(shí)候存在的坑:

        private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)

        {

            Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));

            if (nCode < 0)

            {

                return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

            }

            else

            {

                //判斷是否是鼠標(biāo)點(diǎn)擊  規(guī)避鼠標(biāo)移動(dòng)函數(shù)

                if (wParam.ToString("X2") == "201" || wParam.ToString("X2") == "204")

                {

                    MouseButtons button = MouseButtons.Left;

                    var e = new MouseEventArgs(button, 1, point.X, point.Y, 0);

                    MouseClickEvent?.Invoke(this, e);

                    this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);

                    //return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);

                }

                return default(int);

            }

        }

      注: 標(biāo)記區(qū)域是因?yàn)槲业娜蝿?wù)需求是需要鼠標(biāo)執(zhí)行單擊操作,而不是千篇一律的將鉤子抓取的所有操作都傳出來,一方面是資源開銷大,一方面是確實(shí)不需要,判斷的地方寫的很Low,直接對(duì)比上附的十六進(jìn)制值 務(wù)必注意釋放鉤子?。?!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

fo bs
AI