摘要

   本文分享了如何通过代码实现重复点击按钮。要实现该功能有个关键点需要注意:许多软件的按钮不是一个窗口,所以无法通过枚举窗口或者查找子窗口来定位按钮。本文通过直接定位按钮位置来避免这个问题。

该程序的使用方法:

  1. 管理员运行程序
  2. 移动鼠标指针到需要单击的位置,按“空格”键记录要点击位置
  3. 修改每次点击的间隔周期
  4. 修改点击次数
  5. 点击按钮“开始点击”启动程序
  6. 按“Esc”键可以停止程序。

   实现该功能主要包括两个步骤,获取按钮位置和移动鼠标发送左键按下消息。为了模拟人工单击的效果,本程序在点击完按钮之后增加了移动鼠标到初始位置的逻辑。下面通过代码详细介绍。

获取按钮位置:

   GetPhysicalCursorPos( __out LPPOINT lpPoint),这个函数获取当前鼠标光标所指位置,通过定时器实时刷新,当空格键按下时捕获消息并把当前的光标位置存储下来。

模拟鼠标左键单击实现按钮按下:

   首先通过MoveMouse移动鼠标到记录的按钮位置,之后通过MouseClick发送左键按下消息。这两个函数的详细代码如下:

//移动鼠标到绝对位置
int CSimulateMessageDlg::MoveMouse(unsigned int dx, unsigned int dy)
{INPUT inputs[1] = {};ZeroMemory(inputs, sizeof(inputs));inputs[0].type = INPUT_MOUSE;inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE ;inputs[0].mi.dx = dx;inputs[0].mi.dy = dy;int nSize = ARRAYSIZE(inputs);UINT uSent;uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));if (uSent != ARRAYSIZE(inputs)){//OutputString(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));} return 0;
}
//发送鼠标左键单击消息
int CSimulateMessageDlg::MouseClick(int nMode)
{INPUT inputs[1] = {};ZeroMemory(inputs, sizeof(inputs));inputs[0].type = INPUT_MOUSE;inputs[0].mi.dwFlags = nMode | MOUSEEVENTF_ABSOLUTE ;inputs[0].mi.dx = 0;inputs[0].mi.dy = 0;int nSize = ARRAYSIZE(inputs);UINT uSent;uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));if (uSent != ARRAYSIZE(inputs)){//OutputString(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));} return 0;
}

   注意到MoveMouse这个函数的两个参数dx、dy指的是鼠标移动的绝对位移,是指的鼠标移动的“点”,这个单位与鼠标的dpi有关,其与屏幕坐标系下的单位对应关系通过以下代码计算比率:

int CSimulateMessageDlg::GetMouseCoor2ScreenRatio(void)//计算鼠标移动绝对位移相对屏幕坐标系的比例
{CPoint ptMouse,ptMouseOld;GetPhysicalCursorPos(&ptMouseOld);MoveMouse(0,000);MoveMouse(1000,1000);Sleep(10);BOOL bRet = ::GetPhysicalCursorPos(&ptMouse);if (TRUE == bRet){m_RatioX = (double)1000/ptMouse.x;//1000 是鼠标移动的绝对位移m_RatioY = (double)1000/ptMouse.y;//1000 是鼠标移动的绝对位移MoveMouse(ptMouseOld.x*m_RatioX,ptMouseOld.y*m_RatioY );//归位 return 0;}else{bRet = GetLastError();}return -1;
}

   总结,本代码实现了鼠标单击按钮的简单功能,但是可基于本代码进行更为复杂功能的实现,例如录制多个需要单击的位置实现批量按按钮。

代码及可运行程序:
链接: 源项目链接

C++模拟鼠标移动及单击实现代码相关推荐

  1. php控制鼠标,HTML_用VBS控制鼠标的实现代码(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击、鼠标右击),怎么用VBS模拟鼠标左键单击、 - phpStudy...

    用VBS控制鼠标的实现代码(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击) 怎么用VBS模拟鼠标左键单击.左键双击.右键单击?-- 网上搜到的答案普遍是VBS无法实现,或者是要用第三方COM( ...

  2. Delphi下利用SendInput模拟鼠标键盘

    前言 发了一篇<Delphi下利用WinIo模拟鼠标键盘详解>(http://programbbs.com/bbs/view12-17207-1.htm),再发一个利用SendInput模 ...

  3. 【办公类-13-01】20220703python模拟鼠标 删除“微信收藏“

    背景需求: 模仿CSDN上已有的"python模拟鼠标删除微信收藏"的进行可行性练习. 软件准备及设置: 1.确定坐标位置的软件下载 下载一个"看鼠标"的软件. ...

  4. vc++6.0 模拟鼠标点击代码 木马程序的编写 VC 模拟键盘输入

    From: http://fengqing888.blog.163.com/blog/static/33011416201112124481/ MFC 工程 把以下代码放到你想要响应的函数里面就行 C ...

  5. C# WPF 中用代码模拟鼠标和键盘的操作

    C# WPF 中用代码模拟鼠标和键盘的操作 原文:C# WPF 中用代码模拟鼠标和键盘的操作 原文地址 C#开发者都知道,在Winform开发中,SendKeys类提供的方法是很实用的.但是可惜的是, ...

  6. Control Study - 键盘模拟鼠标(实现用键盘操作鼠标光标)(示例代码下载)

    (一).功能 实现用键盘模拟鼠标移动的功能,在游戏设计中常用到 *操作说明:  当运行程序后,放开鼠标,按键盘上的光标键移动,可以代替鼠标. (二).代码   1  using  System;    ...

  7. Python 8行代码模拟鼠标自动删除微信收藏,Python帮你撩妹!

    上回我们提到了用 pyuserinput 进行模拟键盘鼠标操作,结果发现很多同学都回复无法安装成功,即便安装成功了还是存在很多问题.确实,pyuserinput存在不少问题,包括其安装的pymouse ...

  8. Python 8行代码模拟鼠标自动删除微信收藏

    上回我们提到了用 pyuserinput 进行模拟键盘鼠标操作,结果发现很多同学都回复无法安装成功,即便安装成功了还是存在很多问题.确实,pyuserinput存在不少问题,包括其安装的pymouse ...

  9. 模拟鼠标的左键单击和右键单击

    ' ------------------------------------------- '        模拟鼠标的左键单击和右键单击 ' ---------------------------- ...

  10. java vk减号_[原]在全局鼠标钩子中模拟鼠标右键单击

    //bSwap:BOOL型 //为TRUE为切换左右键功能,为FALSE为恢复原左右键功能 ::SwapMouseButton(bSwap); 可以使用RegisterHotKey()注册一个热键,在 ...

最新文章

  1. python3程序下载安装_程序猿的语言,Python 3.7.0下载安装
  2. 网络情况不稳定 无法连接服务器,提示网络正常无法连接服务器
  3. Python常见的一些面试题,太有用啦!
  4. C#中使用OpenGL(API)创建OpenGL渲染环境
  5. haoop 负载均衡
  6. MyEclipse9 导入ExtJs校验报错的处理办法
  7. 【数论】nefu119 组合素数
  8. 备战数学建模22-数学建模论文写作规范总结
  9. mysql dateofweek_日历表-月的周数
  10. 超大流量分布式系统架构解决方案 人人都是架构师2.0
  11. 软件开发技术文档的编写模块
  12. MySQL使用存储过程造数据
  13. Fiddler抓包流程
  14. 教你如何用PQ魔法师调整硬盘分区大小
  15. mysql navicat视图_Navicat 教程:MySQL 视图
  16. 【Go】解析X509
  17. IDEMIA任命Astrid Warren为首席人力官
  18. 移动通信:1G到5G发展过程简析 -- 什么是5G?
  19. 英语语法总结--动词不定式
  20. 长连接-心跳保活机制

热门文章

  1. noip2017提高组初赛c语言,NOIP2017提高组比赛体验篇一(干货)
  2. html 恶作剧无限弹窗
  3. JDBC连接池技术与Druid
  4. 如何通过自定义属性设置PDMS模型颜色
  5. 国内可外用免费语料库下载资源汇总, 语言翻译必备:国内外23个语料库推荐
  6. 魅族路由器极速版刷机_[技术贴]路由器刷pandavan固件教程——以魅族路由器极速版为例...
  7. Padavan启用ipv6并允许公网访问内网
  8. java实现手机扫描二维码后网站跳转新页面
  9. 经典剖析电源PCB布板与EMC的关系(上)
  10. Win7电脑下载的软件无法安装怎么办?