C#采用mouse
下面我通过代码为大家分享下C#模拟鼠标,具体内容如下: 想必有很多人在项目开发中可能遇见需要做模拟鼠标点击的小功能,很多人会在百度过后采用mouse_event这个函数,不过我并不想讨论如何去使用mouse_event函数怎么去使用,因为那没有多大意义。 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 y); send_message(hWndFromPoint,dwFlags,cButtons,x,y); } 鼠标点击目标时会向鼠标所点击目标窗口投递消息,根据鼠标的按键、状态不同会投递不同的消息,一个完整的“鼠标左键单击”事件过程为“WM_LBUTTONDOWN + WM_LBUTTONUP”即鼠标“先左键按下 + 后左键抬起”,由于mouse_event可以模拟鼠标点击过程而不是直接性一次完整的鼠标单击过程,所以同样存在“按下、抬起” mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP | MOUSEEVENTF_MOVE,-450,1,0); static void edit_position(int dwFlags,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函数主要用于对MOUSEEVENTF_MOVE于MOUSEEVENTF_ABSOLUTE 相对/绝对光标位置修改的一个支持 static void send_message(IntPtr hWnd,int dwFlags,int x,int y) { if ((dwFlags | MOUSEEVENTF_LEFTDOWN) == dwFlags) SendMessage(hWnd,WM_LBUTTONDOWN,MakeDWord(x,y)); if ((dwFlags | MOUSEEVENTF_LEFTUP) == dwFlags) SendMessage(hWnd,WM_LBUTTONUP,y)); if ((dwFlags | MOUSEEVENTF_RIGHTDOWN) == dwFlags) SendMessage(hWnd,WM_RBUTTONDOWN,y)); if ((dwFlags | MOUSEEVENTF_RIGHTUP) == dwFlags) SendMessage(hWnd,WM_RBUTTONUP,y)); if ((dwFlags | MOUSEEVENTF_MIDDLEDOWN) == dwFlags) SendMessage(hWnd,WM_MBUTTONDOWN,y)); if ((dwFlags | MOUSEEVENTF_MIDDLEUP) == dwFlags) SendMessage(hWnd,WM_MBUTTONUP,y)); }
send_message函数主要用于模拟鼠标点击的过程,上面我提到“先左键按下 + 后左键抬起”在上面的代码中你会看的清楚的不得了,如果相反你可以去尝试一番会有什么后果与其说 不如你们自己做更要来的快些。 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 / 合并整数,函数主要是把两个short合并为一个int,分为low、high两部分 static bool screen_to_client(IntPtr hwnd,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函数故名思意,它主要用于把屏幕上的坐标转换到窗口客户上对应坐标 public const int WM_LBUTTONDOWN = 513; // 鼠标左键按下 public const int WM_LBUTTONUP = 514; // 鼠标左键抬起 public const int WM_RBUTTONDOWN = 516; // 鼠标右键按下 public const int WM_RBUTTONUP = 517; // 鼠标右键抬起 public const int WM_MBUTTONDOWN = 519; // 鼠标中键按下 public const int WM_MBUTTONUP = 520; // 鼠标中键抬起 public const int MOUSEEVENTF_MOVE = 0x0001; // 移动鼠标 public const int MOUSEEVENTF_LEFTDOWN = 0x0002; // 鼠标左键按下 public const int MOUSEEVENTF_LEFTUP = 0x0004; // 鼠标左键抬起 public const int MOUSEEVENTF_RIGHTDOWN = 0x0008; // 鼠标右键按下 public const int MOUSEEVENTF_RIGHTUP = 0x0010; // 鼠标右键抬起 public const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; // 鼠标中键按下 public const int MOUSEEVENTF_MIDDLEUP = 0x0040; // 鼠标中键抬起 public const int MOUSEEVENTF_ABSOLUTE = 0x8000; // 绝对坐标 [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 dwExtraInfo);
复制代码 代码如下: mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP,0); 鼠标左键双击(静默): 复制代码 代码如下: mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,2,0); 鼠标移动(相对位置): 复制代码 代码如下: mouse_event(MOUSEEVENTF_MOVE,100,50,0); 鼠标移动(绝对位置): 复制代码 代码如下: mouse_event(MOUSEEVENTF_ABSOLUTE,0); 以上内容比较多请认真学习,希望能够帮助到大家。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |