远程控制关键技术:屏幕控制之一(模拟鼠标)
远程控制关键技术:屏幕控制之一(模拟鼠标)
在远程控制软件的编写中,屏幕控制最重要的部分就是模拟鼠标和模拟键盘操作了,看完这两篇文章,估计大家都很容易明白编写屏幕控制的原理,它的一般流程如下:
一、捕获被控机屏幕 => 发送到控制机。
二、捕获控制机鼠标坐标和操作(映射OnMouseUp,OnMouseDown等) => 发送到被控制机,并模拟鼠标执行。
三、捕获控制机键盘操作(pretranslatemessage中拦截) => 发送到被控制机,模拟键盘执行。
在这篇文章中我们主要来说下模拟鼠标操作所用到的函数,以及范例:
先看一下效果图:

远程控制模拟鼠标操作
具体可以操作演示一下,具体代码见下面。
关键函数:mouse_event();
函数原型:mouse_event(DWORD dwFlag,DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo );
简单用法:
dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。此参数里的各位可以是下列值的任何合理组合:
MOUSEEVENTF_ABSOLUTE:表明参数dX,dy含有规范化的绝对坐标。如果不设置此位,参数含有相对数据:相对于上次位置的改动位置。此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分。
- MOUSEEVENTF_MOVE:表明发生移动。
- MOUSEEVENTF_LEFTDOWN:表明接按下鼠标左键。
- MOUSEEVENTF_LEFTUP:表明松开鼠标左键。
- MOUSEEVENTF_RIGHTDOWN:表明按下鼠标右键。
- MOUSEEVENTF_RIGHTUP:表明松开鼠标右键。
- MOUSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。
- MOUSEEVENTF_MIDDLEUP:表明松开鼠标中键。
- MOUSEEVENTF_WHEEL:在Windows NT中如果鼠标有一个轮,表明鼠标轮被移动。移动的数量由dwData给出。
更加详细用法:
mouse_event百度百科
示例代码:
01 | void CmouseDlg::OnBnClickedMove() |
02 | { |
03 | SetCursorPos(50,130); int i,x = 5,y = 5; |
04 |
05 | for (i = 0;i < 60; i++) |
06 | { |
07 | mouse_event(MOUSEEVENTF_MOVE,x,y,0,0); |
08 |
09 | //每隔一秒钟移动一次 |
10 | Sleep(10); |
11 | } |
12 | } |
13 | void CmouseDlg::OnBnClickedLeft() |
14 | { |
15 | //把鼠标移动到坐标为50,130的位置 |
16 | SetCursorPos(50,130); |
17 | //按下鼠标,并释放 |
18 | mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); |
19 | mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); |
20 | } |
21 | void CmouseDlg::OnBnClickedDoubleleft() |
22 | { |
23 | SetCursorPos(50,130); |
24 | //鼠标双击由两次按下与释放来模拟 |
25 | mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); |
26 | mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); |
27 |
28 | mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); |
29 | mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); |
30 | } |
31 | void CmouseDlg::OnBnClickedRight() |
32 | { |
33 | SetCursorPos(300,300); |
34 | mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0); |
35 | mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0); |
36 | } |