模拟鼠标事件的实现思路及代码
模拟鼠标事件,一般可以通过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 {
LONG dx;
LONG dy;
DWORD mouseData;
DWORD dwFlags;
DWORD time;
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 ( )
{
INPUT Input={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 ( )
{
INPUT Input={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);
INPUT Input={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()
{
INPUT Input={0};
// 设置滚轮量
Input.type = INPUT_MOUSE;
Input.mi.dwFlags = MOUSEEVENTF_WHEEL;
Input.mi.mouseData = 500;
::SendInput(1,&Input,sizeof(INPUT));
}
上一篇:c++面试题字符串拷贝函数示例
栏 目:C语言
下一篇:c语言实现奇偶排序算法
本文标题:模拟鼠标事件的实现思路及代码
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3857.html
您可能感兴趣的文章
- 01-10c语言在控制台判定鼠标左键的小例子
- 01-10linux c模拟ls命令详解
- 01-10浅析c#中如何在form的webbrowser控件中获得鼠标坐标
- 01-10下标操作符重载模拟多维数组详解
- 01-10C实现分子沉积模拟的示例代码
- 01-10怎么锁定鼠标的示例代码分享
- 01-10Cocos2d-x触摸事件实例
- 01-10C++设置事件通知线程工作的方法
- 01-10MFC中动态创建控件以及事件响应实现方法
- 01-10VC++实现模拟汉诺塔效果
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法实例总结
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11ajax实现页面的局部加载
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 04-02jquery与jsp,用jquery
- 01-10SublimeText编译C开发环境设置
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 08-05织梦dedecms什么时候用栏目交叉功能?