模拟鼠标事件的实现思路及代码

所属分类: 软件编程 / C 语言 阅读数: 53
收藏 0 赞 0 分享

模拟鼠标事件,一般可以通过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));
}

更多精彩内容其他人还在看

visual studio 2019编译c++17的方法

这篇文章主要介绍了visual studio 2019编译c++17的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Qt串口通信开发之QSerialPort模块详细使用方法与实例

这篇文章主要介绍了Qt串口通信开发之QSerialPort模块详细使用方法与实例,需要的朋友可以参考下
收藏 0 赞 0 分享

Qt串口通信开发之Qt串口通信模块QSerialPort开发完整实例(串口助手开发)

这篇文章主要介绍了Qt串口通信开发之Qt串口通信模块QSerialPort开发完整实例(串口助手开发),需要的朋友可以参考下
收藏 0 赞 0 分享

Qt串口通信开发之QSerialPort模块简单使用方法与实例

这篇文章主要介绍了Qt串口通信开发之QSerialPort模块简单使用方法与实例,需要的朋友可以参考下
收藏 0 赞 0 分享

Qt串口通信开发之QSerialPort模块Qt串口通信接收数据不完整的解决方法

这篇文章主要介绍了Qt串口通信开发之QSerialPort模块Qt串口通信接收数据不完整的解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失效果实例

这篇文章主要介绍了Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失效果实例,需要的朋友可以参考下
收藏 0 赞 0 分享

Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例

这篇文章主要介绍了Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现加密解密功能

这篇文章主要为大家详细介绍了C语言实现加密解密功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C++实现猴子吃桃的示例代码

这篇文章主要介绍了C++实现猴子吃桃的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C语言实现关机小程序

这篇文章主要为大家详细介绍了C语言实现关机小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多