ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 Office知识技巧免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 277|回复: 5

[分享] 用API模拟鼠标移动

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-1-17 12:57 | 显示全部楼层 |阅读模式
在调用API移动鼠标时碰到了好几个问题,跟大家分享一下。
  1. Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
  2. Public Const MOUSEEVENTF_RIGHTUP = &H10 '  right button up
  3. Public Const MOUSEEVENTF_RIGHTDOWN = &H8 '  right button down
  4. Public Const MOUSEEVENTF_MOVE = &H1 '  mouse move
  5. Public Const MOUSEEVENTF_MIDDLEUP = &H40 '  middle button up
  6. Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '  middle button down
  7. Public Const MOUSEEVENTF_LEFTUP = &H4 '  left button up
  8. Public Const MOUSEEVENTF_ABSOLUTE = &H8000 '  absolute move
  9. Public Const MOUSEEVENTF_LEFTDOWN = &H2 '  left button down
复制代码
以上是关于鼠标的API引用,不用背了现在有代码宝非常方便直接搜索添加就好了
调用了之后就可以直接使用mouse_event了
VB声明
Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
说明
模拟一次鼠标事件
参数表
参数类型及说明
dwFlagsLong,下述标志的一个组合
MOUSEEVENTF_ABSOLUTEdx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
MOUSEEVENTF_MOVE移动鼠标
MOUSEEVENTF_LEFTDOWN模拟鼠标左键按下
MOUSEEVENTF_LEFTUP模拟鼠标左键抬起
MOUSEEVENTF_RIGHTDOWN模拟鼠标右键按下
MOUSEEVENTF_RIGHTUP模拟鼠标右键按下
MOUSEEVENTF_MIDDLEDOWN模拟鼠标中键按下
MOUSEEVENTF_MIDDLEUP模拟鼠标中键按下
dxLong,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动
dyLong,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动
cButtonsLong,未使用
dwExtraInfoLong,通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序

以上是关于mouse_event的介绍

现在我想使用mouse_event去控制我的鼠标
  1. Sub test()
  2.     Dim x As Integer, y As Integer
  3.     x = 10
  4.     y = 0
  5.     mouse_event MOUSEEVENTF_MOVE, x, y, 0, 0
  6. End Sub
复制代码
非常好用,我的鼠标一直向后移动10,根据介绍发现MOUSEEVENTF_MOVE是相对移动,但是我想要控制鼠标移动到某个图标上于是用了
  1. Sub test()
  2.     Dim x As Integer, y As Integer
  3.     x = 1800
  4.     y = 900
  5.     mouse_event MOUSEEVENTF_ABSOLUTE, x, y, 0, 0
  6. End Sub
复制代码
但是发现根本没有反应怎么试都不行,上网查了下资料发现是
Public Const MOUSEEVENTF_ABSOLUTE = &H8000出现了问题,十六进制8000转换为十进制应该是32768,但是从监视窗口发现
1.PNG
明明dwFlags应该是Long,传递到程序中变成了Integer,明明是32768变成了-32768.所以直接修改
Public Const MOUSEEVENTF_ABSOLUTE = 32769
OK!成功了很够正常运行,但是发现坐标不对呀
我定义的坐标是1800,900怎么飘得那么远呢?回头重新看了下MOUSEEVENTF_ABSOLUTE定义
MOUSEEVENTF_ABSOLUTE:dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
OH!原来鼠标移动的屏幕分辨率是65535×65535,那我想要的坐标应该是✖65535➗我当前的分辨率。
  1. Sub move(ByVal x As Integer, ByVal y As Integer)
  2.     Dim screenx As Integer, screeny As Integer
  3.     'SM_CXSCREEN宽, SM_CYSCREEN高
  4.     screenx = GetSystemMetrics(SM_CXSCREEN)
  5.     screeny = GetSystemMetrics(SM_CYSCREEN)
  6.     MsgBox screenx & "," & screeny
  7.     mx = x * 65535 / screenx
  8.     my = y * 65535 / screeny
  9.     mouse_event MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0
  10. End Sub
复制代码
于是重新修改了下代码,现在正常了鼠标可以正常移动过,坐标也没有偏差。





评分

参与人数 1鲜花 +2 收起 理由
zpy2 + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-1-17 15:50 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-1-18 18:48 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-1-18 20:00 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-2-21 02:34 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-21 08:18 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,每天学会一个新技能

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2020-4-8 14:31 , Processed in 0.071538 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表