C#采用mouse_event函數(shù)實(shí)現(xiàn)模擬鼠標(biāo)功能
下面我通過(guò)代碼為大家分享下C#模擬鼠標(biāo),具體內(nèi)容如下:
想必有很多人在項(xiàng)目開(kāi)發(fā)中可能遇見(jiàn)需要做模擬鼠標(biāo)點(diǎn)擊的小功能,很多人會(huì)在百度過(guò)后采用mouse_event這個(gè)函數(shù),不過(guò)我并不想討論如何去使用mouse_event函數(shù)怎么去使用,因?yàn)槟菦](méi)有多大意義。
static void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo) { int x = dx, y = dy; edit_position(dwFlags, dx, dy, ref x, ref y); IntPtr hWndFromPoint = WindowFromPoint(x, y); screen_to_client(hWndFromPoint, ref x, ref y); send_message(hWndFromPoint, dwFlags, cButtons, x, y); }
上述代碼你發(fā)現(xiàn)了什么?如果你發(fā)現(xiàn)說(shuō)明你知道了本文到底在寫(xiě)什么東東 說(shuō)不定你會(huì)有一些興趣看下去,不過(guò)想到我如今混那么凄慘 在工地上做干活 不過(guò)也還好。
鼠標(biāo)點(diǎn)擊目標(biāo)時(shí)會(huì)向鼠標(biāo)所點(diǎn)擊目標(biāo)窗口投遞消息,根據(jù)鼠標(biāo)的按鍵、狀態(tài)不同會(huì)投遞不同的消息,一個(gè)完整的“鼠標(biāo)左鍵單擊”事件過(guò)程為“WM_LBUTTONDOWN +
WM_LBUTTONUP”即鼠標(biāo)“先左鍵按下 + 后左鍵抬起”,由于mouse_event可以模擬鼠標(biāo)點(diǎn)擊過(guò)程而不是直接性一次完整的鼠標(biāo)單擊過(guò)程,所以同樣存在“按下、抬起”
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP | MOUSEEVENTF_MOVE, -450, 0, 1, 0);
mouse_event在沒(méi)有提供MOUSEEVENTF_MOVE量時(shí)光標(biāo)不會(huì)移動(dòng)到相對(duì)位置,“光標(biāo)相對(duì)位置=光標(biāo)現(xiàn)行位置+新光標(biāo)位置”如果提供量“MOUSEEVENTF_ABSOLUTE”絕對(duì)位置,則會(huì)以“新光標(biāo)位置”為準(zhǔn)而不會(huì)添加“光標(biāo)現(xiàn)行位置”
static void edit_position(int dwFlags, int dx, int dy, ref int x, ref int y) { Point pos = MousePosition; x = x + pos.X; y = y + pos.Y; if ((dwFlags | MOUSEEVENTF_ABSOLUTE) == dwFlags) SetCursorPos(dx, dy); if ((dwFlags | MOUSEEVENTF_MOVE) == dwFlags) SetCursorPos(x, y); }
edit_position函數(shù)主要用于對(duì)MOUSEEVENTF_MOVE于MOUSEEVENTF_ABSOLUTE
相對(duì)/絕對(duì)光標(biāo)位置修改的一個(gè)支持
static void send_message(IntPtr hWnd, int dwFlags, int cButtons, int x, int y) { if ((dwFlags | MOUSEEVENTF_LEFTDOWN) == dwFlags) SendMessage(hWnd, WM_LBUTTONDOWN, cButtons, MakeDWord(x, y)); if ((dwFlags | MOUSEEVENTF_LEFTUP) == dwFlags) SendMessage(hWnd, WM_LBUTTONUP, cButtons, MakeDWord(x, y)); if ((dwFlags | MOUSEEVENTF_RIGHTDOWN) == dwFlags) SendMessage(hWnd, WM_RBUTTONDOWN, cButtons, MakeDWord(x, y)); if ((dwFlags | MOUSEEVENTF_RIGHTUP) == dwFlags) SendMessage(hWnd, WM_RBUTTONUP, cButtons, MakeDWord(x, y)); if ((dwFlags | MOUSEEVENTF_MIDDLEDOWN) == dwFlags) SendMessage(hWnd, WM_MBUTTONDOWN, cButtons, MakeDWord(x, y)); if ((dwFlags | MOUSEEVENTF_MIDDLEUP) == dwFlags) SendMessage(hWnd, WM_MBUTTONUP, cButtons, MakeDWord(x, y)); }
send_message函數(shù)主要用于模擬鼠標(biāo)點(diǎn)擊的過(guò)程,上面我提到“先左鍵按下 + 后左鍵抬起”在上面的代碼中你會(huì)看的清楚的不得了,如果相反你可以去嘗試一番會(huì)有什么后果與其說(shuō)
不如你們自己做更要來(lái)的快些。
static int MakeDWord(int low, int high) { return low + (high * Abs(~ushort.MaxValue)); } static int Abs(int value) { return ((value >> 31) ^ value) - (value >> 31); } MakeDWord / 合并整數(shù),函數(shù)主要是把兩個(gè)short合并為一個(gè)int,分為low、high兩部分 static bool screen_to_client(IntPtr hwnd, ref int x, ref int y) { bool bRetVal = false; Point lpptPos = new Point(x, y); if ((bRetVal = ScreenToClient(hwnd, ref lpptPos))) { x = lpptPos.X; y = lpptPos.Y; } return bRetVal; } screen_to_client函數(shù)故名思意,它主要用于把屏幕上的坐標(biāo)轉(zhuǎn)換到窗口客戶上對(duì)應(yīng)坐標(biāo) public const int WM_LBUTTONDOWN = 513; // 鼠標(biāo)左鍵按下 public const int WM_LBUTTONUP = 514; // 鼠標(biāo)左鍵抬起 public const int WM_RBUTTONDOWN = 516; // 鼠標(biāo)右鍵按下 public const int WM_RBUTTONUP = 517; // 鼠標(biāo)右鍵抬起 public const int WM_MBUTTONDOWN = 519; // 鼠標(biāo)中鍵按下 public const int WM_MBUTTONUP = 520; // 鼠標(biāo)中鍵抬起 public const int MOUSEEVENTF_MOVE = 0x0001; // 移動(dòng)鼠標(biāo) public const int MOUSEEVENTF_LEFTDOWN = 0x0002; // 鼠標(biāo)左鍵按下 public const int MOUSEEVENTF_LEFTUP = 0x0004; // 鼠標(biāo)左鍵抬起 public const int MOUSEEVENTF_RIGHTDOWN = 0x0008; // 鼠標(biāo)右鍵按下 public const int MOUSEEVENTF_RIGHTUP = 0x0010; // 鼠標(biāo)右鍵抬起 public const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; // 鼠標(biāo)中鍵按下 public const int MOUSEEVENTF_MIDDLEUP = 0x0040; // 鼠標(biāo)中鍵抬起 public const int MOUSEEVENTF_ABSOLUTE = 0x8000; // 絕對(duì)坐標(biāo) [DllImport("user32.dll", SetLastError = true)] public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr WindowFromPoint(int xPoint, int yPoint); [DllImport("user32.dll", SetLastError = true)] public static extern int SetCursorPos(int x, int y); [DllImport("user32.dll", SetLastError = true)] public static extern bool ScreenToClient(IntPtr hWnd, ref Point lppt); // [DllImport("user32", SetLastError = true)] // public static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
鼠標(biāo)右鍵單擊(靜默):
mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 1, 0);
鼠標(biāo)左鍵雙擊(靜默):
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 2, 0);
鼠標(biāo)移動(dòng)(相對(duì)位置):
mouse_event(MOUSEEVENTF_MOVE, 100, 50, 0, 0);
鼠標(biāo)移動(dòng)(絕對(duì)位置):
mouse_event(MOUSEEVENTF_ABSOLUTE, 100, 50, 0, 0);
以上內(nèi)容比較多請(qǐng)認(rèn)真學(xué)習(xí),希望能夠幫助到大家。
- c# 在WebBrowser中用SendMessage模擬鼠標(biāo)點(diǎn)擊
- C#模擬Http與Https請(qǐng)求框架類(lèi)實(shí)例
- C#模擬http 發(fā)送post或get請(qǐng)求的簡(jiǎn)單實(shí)例
- C#實(shí)現(xiàn)的三種模擬自動(dòng)登錄和提交POST信息的方法
- C# SendInput 模擬鼠標(biāo)操作的實(shí)現(xiàn)方法
- 使用C#發(fā)送Http請(qǐng)求實(shí)現(xiàn)模擬登陸實(shí)例
- C#基于socket模擬http請(qǐng)求的方法
- c#模擬銀行atm機(jī)示例分享
- C#模擬window操作鼠標(biāo)的方法
- C#如何使用Bogus創(chuàng)建模擬數(shù)據(jù)示例代碼
相關(guān)文章
C#實(shí)現(xiàn)的ACCESS數(shù)據(jù)庫(kù)操作類(lèi)完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的ACCESS數(shù)據(jù)庫(kù)操作類(lèi),結(jié)合完整實(shí)例形式分析了C#針對(duì)access數(shù)據(jù)庫(kù)增刪改查、事務(wù)、結(jié)果處理等相關(guān)操作技巧,需要的朋友可以參考下2017-05-05unity3D實(shí)現(xiàn)物體任意角度自旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了unity3D實(shí)現(xiàn)物體任意角度自旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07C#對(duì)DataTable中的某列進(jìn)行分組
這篇文章介紹了C#對(duì)DataTable某列進(jìn)行分組的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03C#中const,readonly和static關(guān)鍵字的用法介紹
這篇文章介紹了C#中const,readonly和static關(guān)鍵字的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08C#WinForm實(shí)現(xiàn)多語(yǔ)言切換的示例
本文主要介紹了C#WinForm實(shí)現(xiàn)多語(yǔ)言切換的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01C#中通過(guò)LRU實(shí)現(xiàn)通用高效的超時(shí)連接探測(cè)
這篇文章主要介紹了c#中通過(guò)LRU實(shí)現(xiàn)通用高效的超時(shí)連接探測(cè),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-11-11WPF開(kāi)發(fā)之UniformGrid和ItemsControl的應(yīng)用詳解
為了簡(jiǎn)化開(kāi)發(fā),WPF提供了UniformGrid布局和ItemsControl容器,本文以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述如何在WPF開(kāi)發(fā)中應(yīng)用UniformGrid和ItemsControl實(shí)現(xiàn)均勻的布局,希望對(duì)大家有所幫助2024-01-01