声明:本位出自悠然品鉴原创,禁止伪原创性质抄袭,转载请务必注明出
处:http://www.youranshare.com/blog/sid/69.html
今天写了一个远程屏幕监控的模块儿,并且在这个模块儿中需要实现基本的鼠标键盘的远程模拟控制,起初自己一点儿思路都没有,后来谷歌了一下得到了自己想要的答案,并且花了会儿时间完成了基本的鼠标模拟控制,这里就给大家分享一下如何模拟鼠标与键盘的事件。
· 鼠标的事件模拟
对于鼠标事件的模拟,这里就以鼠标的双击事件为例子简单的说明一下:
如果我们要模拟一个鼠标的事件,首先我们要告诉系统你的鼠标是单击了左键还是单击了右键,其次你总得告诉系统你点击的位置吧、于是乎系统被告知要在 (x,y)出触发一次你想要的鼠标事件,这样就完成了鼠标的模拟。
在VC++中鼠标的模拟事件是通过函数mouse_event()来完成的,在这个函数中我们指定模拟的事件,然后指出是事件发生的坐标,就能够完成一次模拟。
首先来看一下mouse_event()这个函数,
VOID mouse_event( DWORD dwFlags, // motion and click options DWORD dx, // horizontal position or change DWORD dy, // vertical position or change DWORD dwData, // wheel movement ULONG_PTR dwExtraInfo // application-defined information );
参数1:告诉系统你的鼠标事件,一共有下面的几种鼠
标事件可供选择:
MOUSEEVENTF_ABSOLUTE:表明参数dX,dy含有规范化的绝对坐标。如果不设置此位,那么dX和dY是相对于上一次鼠标的位置,例如上一次鼠标通过SetCursorPos(0,0)将鼠标的位置设置为了(0,0),那么这个时候的dX和dY就是相对于(0,0)的偏移。
此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,还是需要下面的几个类型的参数的:
MOUSEEVENTF_MOVE:表明发生移动。
MOUSEEVENTF_LEFTDOWN:表明接按下鼠标左键。
MOUSEEVENTF_LEFTUP:表明松开鼠标左键。
MOUSEEVENTF_RIGHTDOWN:表明按下鼠标右键。
MOUSEEVENTF_RIGHTUP:表明松开鼠标右键。
MOUSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。
MOUSEEVENTF_MIDDLEUP:表明松开鼠标中键。
MOUSEEVENTF_WHEEL:如果鼠标有一个滚轮,表明鼠标轮被移动。移动的数量由dwData给出。
参数2:事件发生的x坐标,但也可能是偏移量
参数3:事件发生的y坐标,但也可能是偏移量
参数4:dwData:,如果dwFlags为MOUSEEVENTF_WHEEL,
则dwData指定鼠标轮移动的数量。正值表明鼠
标轮向前转动,即远离用户的方向;负值表明鼠
标轮向后转动,即朝向用户。一个轮击定义为
WHEEL_DELTA,即120。
参数5:指定与鼠标事件相关的附加32位值。应用程序
调用函数GetMessageExtraInfo来获得此附
加信息。
OK上面的就是mouse_event()基本使用参数了,我们一鼠标双击(100,100)这个坐标为例子写一段代码片段吧,注意对于双击来说,其实就是短时间内左键按下然后左键弹起:
//首先直接鼠标位置设置为(100,100) SetCursorPos(100,100); //然后,完成一次点击,(按下弹起) mouse_event(MOUSEEVENTF_LEFTDOWN ,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); //注意鼠标两次点击之间应当有一个时间间隔,否则可能不会出发双击的 Sleep(100); //再来一次点击 mouse_event(MOUSEEVENTF_LEFTDOWN ,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
经过上面的操作就完成了双击事件.
其他的鼠标事件是类似的,双击事件已经基本涵盖了所有事件的用法。
· 键盘按键的模拟
与鼠标的模拟类似,这里就简单的说一下,键盘的按键模拟使用函数:
VOID keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,DWORD dwExtralnfo);
参数1:一个8位的按键虚拟码,注意是1~254之间的
参数2:定义该键的硬件扫描码:。
参数3:定义函数操作的各个方面的一个标志位集。应用程
序可使用如下一些预定义常数的组合设置标志位。
KEYEVENTF_EXTENDEDKEY:若指定该值,则扫描码前
一个值为OXEO(224)的前缀字节。
KEYEVENTF_KEYUP:若指定该值,该键将被释放;若
未指定该值,该键将被按下。
参数4:定义与击键相关的附加的32位值。
//下面就以一个 Shift+Z的组合按键消息为例子吧 //短时间内将两个按键都设置为按下 keybd_event(VK_SHIFT,0,0,0);//按下Shift键 keybd_event('Z',0,0,0);//按下Z键 //短时间内同时松开 keybd_event('Z',0,KEYEVENTF_KEYUP,0);//松开Z键 keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);//松开Shift键
通过上面的操作,就形成了Shift+Z 生成大写的’Z’字符
声明:本位出自悠然品鉴原创,禁止伪原创性质抄袭,转载请务必注明出
处:http://www.youranshare.com/blog/sid/69.html