网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

VC++ 鼠标事件、键盘事件模拟

声明:本位出自悠然品鉴原创,禁止伪原创性质抄袭,转载请务必注明出

处: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





  • 标签:
  • 鼠标模拟点击
  • 键盘按键模拟
  • mouse_event
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.