展会信息港展会大全

模拟鼠标事件的实现思路及代码 c语言编程开发
来源:互联网   发布日期:2016-01-19 12:57:44   浏览:2430次  

导读:这篇文章主要介绍了模拟鼠标事件的实现思路及代码,有需要的朋友可以参考一下模拟鼠标事件,一般可以通过mouse_event()和SendInPut()两种方法。mouse_event()在windows后期版本中逐渐被SendInPut()取代。SendInP ...

这篇文章主要介绍了模拟鼠标事件的实现思路及代码,有需要的朋友可以参考一下

模拟鼠标事件,一般可以通过mouse_event()和SendInPut()两种方法。mouse_event()在windows后期版本中逐渐被SendInPut()取代。SendInPut()模拟鼠标移动的事件中,标志位取值不同,输入坐标的意义也不同。简单来说就是,添加 MOUSEEVENTF_ABSOLUTE标志位表示鼠标移动是通过绝对坐标定位,此时的坐标要通过转换。光标在屏幕中被分成65535个小块,可以通过如下转换:

代码如下:

double fx = x *(65535.0f / fScreenWidth);

double fy = y *(65535.0f / fScreenHeight);

若不使用MOUSEEVENTF_ABSOLUTE标志位,则坐标是相对前一坐标的位移。

SendInPut()鼠标时间使用结构如下:

代码如下:

typedef struct tagMOUSEINPUT {

LONGdx;

LONGdy;

DWORDmouseData;

DWORDdwFlags;

DWORDtime;

ULONG_PTR dwExtraInfo;

} MOUSEINPUT, *PMOUSEINPUT, FAR* LPMOUSEINPUT;

msdn中完整解释如下:

dx 鼠标的绝对位置,或自上次鼠标事件的运动量产生的dwFlags成员的值而定。鼠标的x坐标被指定为绝对的数据,相对于被指定为数据的移动像素数。

dy 鼠标的绝对位置,或自上次鼠标事件的运动量产生的dwFlags成员的值而定。鼠标的y坐标被指定为绝对的数据,相对于被指定为数据的移动像素数。

mouseData 如果dwFlags中包含MOUSEEVENTF_WHEEL,mouseData指定滚轮运动的量。正值表示滚轮向前旋转,即远离用户,负值表示滚轮向后旋转,即朝向用户。滚轮被定义为WHEEL_DELTA,这是120。

下面代码演示了鼠标的几个具体操作。

1、我怎样才能在应用程序中模拟鼠标事件?

有两个API函数可以使用:mouse_event()和SendInput();

2、应该使用哪个API函数?

在Windows NT/2000/XP中,mouse_event()函数已经被SendInput()函数已被取代的。因此,在这些操作系统上,你应该使用 SendInput()函数。(除非你需要提供向后兼容性与Windows98等)。

3、如何使用SendInput()函数来模拟点击鼠标左键?

代码如下:

void LeftClick ( )

{

INPUTInput={0};

// 左键按下

Input.type= INPUT_MOUSE;

Input.mi.dwFlags= MOUSEEVENTF_LEFTDOWN;

::SendInput(1,&Input,sizeof(INPUT));

// 左键抬起

::ZeroMemory(&Input,sizeof(INPUT));

Input.type= INPUT_MOUSE;

Input.mi.dwFlags= MOUSEEVENTF_LEFTUP;

::SendInput(1,&Input,sizeof(INPUT));

}

4、如何使用SendInput()函数来模拟点击鼠标右键?

代码如下:

void RightClick ( )

{

INPUTInput={0};

// 右键按下

Input.type= INPUT_MOUSE;

Input.mi.dwFlags= MOUSEEVENTF_RIGHTDOWN;

::SendInput(1,&Input,sizeof(INPUT));

// 右键抬起

::ZeroMemory(&Input,sizeof(INPUT));

Input.type= INPUT_MOUSE;

Input.mi.dwFlags= MOUSEEVENTF_RIGHTUP;

::SendInput(1,&Input,sizeof(INPUT));

}

5、如何使用SendInput()函数模拟鼠标的移动?

代码如下:

void MouseMove (int x, int y )

{

double fScreenWidth= ::GetSystemMetrics( SM_CXSCREEN )-1;

double fScreenHeight= ::GetSystemMetrics( SM_CYSCREEN )-1;

double fx = x*(65535.0f/fScreenWidth);

double fy = y*(65535.0f/fScreenHeight);

INPUTInput={0};

Input.type= INPUT_MOUSE;

Input.mi.dwFlags= MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE;

Input.mi.dx = fx;

Input.mi.dy = fy;

::SendInput(1,&Input,sizeof(INPUT));

}

6、如何使用SendInput()函数来模拟点击鼠标中键?

代码如下:

void MiddleClick()

{

INPUTInput={0};

// 设置滚轮量

Input.type= INPUT_MOUSE;

Input.mi.dwFlags= MOUSEEVENTF_WHEEL;

Input.mi.mouseData = 500;

::SendInput(1,&Input,sizeof(INPUT));

}

赞助本站

人工智能实验室

相关热词: 鼠标事件 模拟

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港