您好,登錄后才能下訂單哦!
記一次鼠標鉤子的使用
惰性啊,好久沒寫東西了,但是今天這東西太重要,所以決心記下來,后續可以看看。
鼠標鉤子(MouseHock),很少使用的一個功能,偶爾要用了也會因為各種涉及操作系統底層的接口讓我這種水貨避而遠之,話又說回來了,興趣是最好的老師,這次我Get了這個技能,但由于這個功能太過于強大,屬于非托管資源,用完請立即釋放鉤子,否則你QQ回車發送的東西能傳到你調試的XXXAPI你信不。。。
顧名思義,圍繞著鼠標的操作而進行的,提前附上鼠標的相關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; 十六進制的值,注意和十進制之間的轉換
鉤子源碼網上很多就不敲了,使用過程簡單說一下:
創建對象
安裝鉤子
綁定事件
卸載鉤子(釋放資源)
鉤子里有這樣一段代碼,說下用的時候存在的坑:
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
{
//判斷是否是鼠標點擊 規避鼠標移動函數
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);
}
}
注: 標記區域是因為我的任務需求是需要鼠標執行單擊操作,而不是千篇一律的將鉤子抓取的所有操作都傳出來,一方面是資源開銷大,一方面是確實不需要,判斷的地方寫的很Low,直接對比上附的十六進制值 務必注意釋放鉤子!!!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。