亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#模擬鼠標(mouse_event)

2019-11-14 15:54:20
字體:
來源:轉載
供稿:網友

想必有很多人在項目開發中可能遇見需要做模擬鼠標點擊的小功能,很多人會在

百度過后采用mouse_event這個函數,不過我并不想討論如何去使用mouse_event

函數怎么去使用,因為那沒有多大意義。

 

[csharp] view plaincopy
  1. static void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo)  
  2. {  
  3.     int x = dx, y = dy;  
  4.     edit_position(dwFlags, dx, dy, ref x, ref y);   
  5.     IntPtr hWndFromPoint = WindowFromPoint(x, y);  
  6.     screen_to_client(hWndFromPoint, ref x, ref y);   
  7.     send_message(hWndFromPoint, dwFlags, cButtons, x, y);  
  8. }  

 

上述代碼你發現了什么?如果你發現說明你知道了本文到底在寫什么東東 說不定你

會有一些興趣看下去,不過想到我如今混那么凄慘 在工地上做干活 不過也還好。

鼠標點擊目標時會向鼠標所點擊目標窗口投遞消息,根據鼠標的按鍵、狀態不同會

投遞不同的消息,一個完整的“鼠標左鍵單擊”事件過程為“WM_LBUTTONDOWN + 

WM_LBUTTONUP”即鼠標“先左鍵按下 + 后左鍵抬起”,由于mouse_event可以模擬

鼠標點擊過程而不是直接性一次完整的鼠標單擊過程,所以同樣存在“按下、抬起”

 

[csharp] view plaincopy
  1. mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP | MOUSEEVENTF_MOVE, -450, 0, 1, 0);  

mouse_event在沒有提供MOUSEEVENTF_MOVE量時光標不會移動到相對位置,

 

“光標相對位置=光標現行位置+新光標位置”如果提供量“MOUSEEVENTF_ABSOLUTE”

絕對位置,則會以“新光標位置”為準而不會添加“光標現行位置”

 

[csharp] view plaincopy
  1. static void edit_position(int dwFlags, int dx, int dy, ref int x, ref int y)  
  2. {  
  3.     Point pos = MousePosition;  
  4.     x = x + pos.X;  
  5.     y = y + pos.Y;  
  6.     if ((dwFlags | MOUSEEVENTF_ABSOLUTE) == dwFlags)  
  7.         SetCursorPos(dx, dy);  
  8.     if ((dwFlags | MOUSEEVENTF_MOVE) == dwFlags)  
  9.         SetCursorPos(x, y);  
  10. }  

 

edit_position函數主要用于對MOUSEEVENTF_MOVE于MOUSEEVENTF_ABSOLUTE

相對/絕對光標位置修改的一個支持

 

[csharp] view plaincopy
  1. static void send_message(IntPtr hWnd, int dwFlags, int cButtons, int x, int y)  
  2. {  
  3.     if ((dwFlags | MOUSEEVENTF_LEFTDOWN) == dwFlags)  
  4.         SendMessage(hWnd, WM_LBUTTONDOWN, cButtons, MakeDWord(x, y));  
  5.     if ((dwFlags | MOUSEEVENTF_LEFTUP) == dwFlags)  
  6.         SendMessage(hWnd, WM_LBUTTONUP, cButtons, MakeDWord(x, y));  
  7.     if ((dwFlags | MOUSEEVENTF_RIGHTDOWN) == dwFlags)  
  8.         SendMessage(hWnd, WM_RBUTTONDOWN, cButtons, MakeDWord(x, y));  
  9.     if ((dwFlags | MOUSEEVENTF_RIGHTUP) == dwFlags)  
  10.         SendMessage(hWnd, WM_RBUTTONUP, cButtons, MakeDWord(x, y));  
  11.     if ((dwFlags | MOUSEEVENTF_MIDDLEDOWN) == dwFlags)  
  12.         SendMessage(hWnd, WM_MBUTTONDOWN, cButtons, MakeDWord(x, y));  
  13.     if ((dwFlags | MOUSEEVENTF_MIDDLEUP) == dwFlags)  
  14.         SendMessage(hWnd, WM_MBUTTONUP, cButtons, MakeDWord(x, y));  
  15. }  

 

send_message函數主要用于模擬鼠標點擊的過程,上面我提到“先左鍵按下 + 后左鍵抬起”

在上面的代碼中你會看的清楚的不得了,如果相反你可以去嘗試一番會有什么后果 與其說

不如你們自己做更要來的快些。

 

[csharp] view plaincopy
  1. static int MakeDWord(int low, int high)  
  2. {  
  3.     return low + (high * Abs(~ushort.MaxValue));  
  4. }  
  5.   
  6. static int Abs(int value)  
  7. {  
  8.     return ((value >> 31) ^ value) - (value >> 31);  
  9. }  

MakeDWord / 合并整數,函數主要是把兩個short合并為一個int,分為low、high兩部分

 

 

[csharp] view plaincopy
  1. static bool screen_to_client(IntPtr hwnd, ref int x, ref int y)  
  2. {  
  3.     bool bRetVal = false;  
  4.     Point lPPTPos = new Point(x, y);  
  5.     if ((bRetVal = ScreenToClient(hwnd, ref lpptPos)))  
  6.     {  
  7.         x = lpptPos.X;  
  8.         y = lpptPos.Y;  
  9.     }  
  10.     return bRetVal;  
  11. }  

screen_to_client函數故名思意,它主要用于把屏幕上的坐標轉換到窗口客戶上對應坐標

 

 

[csharp] view plaincopy
  1. public const int WM_LBUTTONDOWN = 513; // 鼠標左鍵按下  
  2. public const int WM_LBUTTONUP = 514; // 鼠標左鍵抬起  
  3. public const int WM_RBUTTONDOWN = 516; // 鼠標右鍵按下  
  4. public const int WM_RBUTTONUP = 517; // 鼠標右鍵抬起  
  5. public const int WM_MBUTTONDOWN = 519; // 鼠標中鍵按下  
  6. public const int WM_MBUTTONUP = 520; // 鼠標中鍵抬起  
  7.   
  8. public const int MOUSEEVENTF_MOVE = 0x0001; // 移動鼠標         
  9. public const int MOUSEEVENTF_LEFTDOWN = 0x0002; // 鼠標左鍵按下        
  10. public const int MOUSEEVENTF_LEFTUP = 0x0004; // 鼠標左鍵抬起        
  11. public const int MOUSEEVENTF_RIGHTDOWN = 0x0008; // 鼠標右鍵按下       
  12. public const int MOUSEEVENTF_RIGHTUP = 0x0010; // 鼠標右鍵抬起          
  13. public const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; // 鼠標中鍵按下    
  14. public const int MOUSEEVENTF_MIDDLEUP = 0x0040; // 鼠標中鍵抬起           
  15. public const int MOUSEEVENTF_ABSOLUTE = 0x8000; // 絕對坐標   

 

 

[csharp] view plaincopy
  1. [DllImport("user32.dll", SetLastError = true)]  
  2. public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);  
  3.   
  4. [DllImport("user32.dll", SetLastError = true)]  
  5. public static extern IntPtr WindowFromPoint(int xPoint, int yPoint);  
  6.   
  7. [DllImport("user32.dll", SetLastError = true)]  
  8. public static extern int SetCursorPos(int x, int y);  
  9.   
  10. [DllImport("user32.dll", SetLastError = true)]  
  11. public static extern bool ScreenToClient(IntPtr hWnd, ref Point lppt);  
  12.   
  13. // [DllImport("user32", SetLastError = true)]  
  14. // public static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);  

鼠標右鍵單擊(靜默):

 

 

[csharp] view plaincopy
  1. mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 1, 0);  

 

鼠標左鍵雙擊(靜默):

 

[csharp] view plaincopy
  1. mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 2, 0);  

鼠標移動(相對位置):

 

 

[csharp] view plaincopy
  1. mouse_event(MOUSEEVENTF_MOVE, 100, 50, 0, 0);  

鼠標移動(絕對位置):

 

 

[csharp] view plaincopy
  1. mouse_event(MOUSEEVENTF_ABSOLUTE, 100, 50, 0, 0);  

好了就這么多吧,現在渾身頭暈腦漲的 話說多了反倒不好 自己從代碼中領悟才是真


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美中文字幕在线视频| 91av在线播放| 欧美激情a∨在线视频播放| 国产一区二区三区在线免费观看| 久久久久久久久久久国产| 欧美日韩一区二区三区在线免费观看| 欧美性猛交视频| 热久久99这里有精品| 91福利视频网| 中文字幕日韩欧美在线| 岛国av一区二区三区| 亚洲女成人图区| 欧美在线一区二区三区四| 国产成人中文字幕| 538国产精品一区二区免费视频| 国产精品极品在线| 欧美激情xxxx性bbbb| 成人激情免费在线| 久久中文字幕在线视频| 成人妇女淫片aaaa视频| 欧美激情一区二区三区高清视频| 亚洲网站在线播放| 在线观看精品自拍私拍| 欧美日韩成人在线视频| 亚洲aaa激情| 欧美国产第二页| 国产精品露脸自拍| 成人日韩av在线| 色悠悠久久88| www国产亚洲精品久久网站| 亚洲成人黄色在线| 精品亚洲aⅴ在线观看| 成人黄色在线观看| 国产精品99久久久久久白浆小说| 日韩高清不卡av| 国产免费亚洲高清| 8050国产精品久久久久久| 国产亚洲精品久久久优势| 国产精品福利在线观看网址| 精品久久久国产精品999| 亚洲视频一区二区三区| 日韩中文字幕免费视频| 精品日韩中文字幕| 亚洲国产日韩精品在线| 91精品中国老女人| 久久久久久18| www.欧美三级电影.com| 欧美一级电影免费在线观看| 国产成人精品电影久久久| 久久精品99久久香蕉国产色戒| 欧美亚洲视频在线看网址| 久久亚洲春色中文字幕| 日韩精品久久久久久久玫瑰园| 国产美女精彩久久| 色香阁99久久精品久久久| 久久久久成人精品| 成人性教育视频在线观看| 午夜精品一区二区三区在线视频| 国产精品国产三级国产aⅴ9色| 欧美丰满少妇xxxxx做受| 日韩免费看的电影电视剧大全| 日韩成人激情影院| 日本三级久久久| 国产成人精品免高潮在线观看| 国产精品久久久91| 亚洲第一中文字幕在线观看| 91久久综合亚洲鲁鲁五月天| 欧美精品电影免费在线观看| 中文字幕欧美在线| 精品人伦一区二区三区蜜桃网站| 久久五月天色综合| 成人免费看黄网站| 日韩中文字在线| 国产欧美在线播放| 欧美激情一区二区久久久| 秋霞av国产精品一区| 尤物yw午夜国产精品视频明星| 亚洲性视频网站| 国产成人avxxxxx在线看| 美女撒尿一区二区三区| 国产精品日韩在线播放| 欧美亚洲午夜视频在线观看| 26uuu国产精品视频| 国产精品视频在线播放| 国产精品一二三在线| 亚洲精品久久久久中文字幕二区| 成人黄色激情网| 国产精品网站入口| 欧美午夜影院在线视频| 久久精品视频亚洲| 国产成人亚洲综合91| 久久久人成影片一区二区三区观看| 久久久久久高潮国产精品视| 中文字幕国产精品| 日韩免费在线视频| 日韩欧美成人精品| 成人在线一区二区| 国产999在线观看| 日本亚洲欧洲色α| 日韩一级黄色av| 国产精品88a∨| 午夜精品久久久久久久久久久久久| 国产性色av一区二区| 日韩国产精品一区| 亚洲free性xxxx护士hd| 91在线|亚洲| 久久久国产精品免费| 亚洲成人精品视频在线观看| 亚洲国产欧美一区二区丝袜黑人| 2019国产精品自在线拍国产不卡| 亚洲精品小视频在线观看| 91精品久久久久久久久久久| 7m第一福利500精品视频| 欧美小视频在线观看| 懂色av影视一区二区三区| 亚洲国产精品久久久| 欧美国产亚洲精品久久久8v| 97精品国产aⅴ7777| 综合欧美国产视频二区| 亚洲午夜未删减在线观看| 97色伦亚洲国产| 中文字幕日韩欧美在线| 国产精品普通话| 欧美另类老肥妇| 91久久中文字幕| 91精品久久久久久久久不口人| 91精品国产91久久久| 亚洲国产欧美一区二区三区同亚洲| 青草青草久热精品视频在线网站| 日韩最新中文字幕电影免费看| 国产精品国产三级国产专播精品人| 亚洲天堂av在线免费| 欧美在线一级va免费观看| 久久99久久久久久久噜噜| 在线视频日本亚洲性| 91网站免费观看| 久久久999精品视频| 国产91久久婷婷一区二区| 欧美高清在线播放| 欧美性猛交xxxxx免费看| 国产日韩欧美电影在线观看| 久久久国产精品视频| 国产69精品久久久久9| 8090理伦午夜在线电影| 国产成人综合精品在线| 亚洲丝袜一区在线| 欧美日韩国产成人在线| 亚洲网站在线观看| 日韩av手机在线看| 午夜精品99久久免费| 91亚洲人电影| 啪一啪鲁一鲁2019在线视频| 91中文在线视频| 亚洲理论片在线观看| 久久青草福利网站| 久久成年人免费电影| 色天天综合狠狠色| 国产精品视频白浆免费视频| 久久99国产综合精品女同| 一区二区三区天堂av| 亚洲色图第三页| 91国产精品视频在线| 久久久久久久久网站| 性视频1819p久久|