win10下调用mouse_event的API函数,无法识别Or连接,代码混乱。

dai2248157327 2021-01-10 01:07:31
win10下调用mouse_event的API函数,无法识别Or连接,代码混乱。
win10下调用mouse_event函数,进行移动鼠标操作,发现执行命令,无法实现移动。

代码如下:

Private Declare Sub mouse 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)
Private Declare Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long '获取分辨率
Private Const MOUSEEVENTF_ABSOLUTE = &H8000 '指定鼠标使用绝对坐标系,此时,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
Private Const MOUSEEVENTF_MOVE = &H1 '移动鼠标
Private Const MOUSEEVENTF_LEFTDOWN = &H2 '模拟鼠标左键按下
Private Const MOUSEEVENTF_LEFTUP = &H4 '模拟鼠标左键抬起
Private Sub shubiaoyidong(ByVal x As Long, ByVal y As Long)
mw = x* 65535 / GetSystemMetrics32(0)
mh = y * 65535 / GetSystemMetrics32(1)
'移动
mouse MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, mw, mh, 0, 0
End Sub
Sub test()
shubiaoyidong 998, 745
End Sub

点击宏运行后,发现鼠标在win10下无法移动,无法执行命令,这里不知道出了什么问题?

如何将Or改成符号&,则虽然可以这些命令,但是执行命令过程中会实现鼠标右键点击的功能,出现执行混乱的情况,代码不能正常执行,请问大神能找出问题在哪么?我问过相关的经验人员也不能给出合理回答,请各位大神老师帮忙指点一下!
...全文
988 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
prophetk 2023-05-30
  • 打赏
  • 举报
回复 1

不用这么麻烦 这一句改成 Private Const MOUSEEVENTF_ABSOLUTE = &H8000& 即可
后面加个& 代表长整型

dai2248157327 2021-03-29
  • 打赏
  • 举报
回复
脆皮大雪糕,真是大师级别的水准,佩服的五体投地,这个一定是对C语言和VB语言理论基础知识非常了解,而且不是一般通晓编程的。这里给您深鞠一躬,表示感谢!
vansoft 2021-01-15
  • 打赏
  • 举报
回复
楼上威武,向你学习。
脆皮大雪糕 2021-01-11
  • 打赏
  • 举报
回复 1
哈哈哈哈,这个问题也曾经困扰我。 下面讲讲原因,嫌烦直接看最后解决办法。 你是看了API文档了吧 ,而且看了C语言的调用样例了吧。
const int MOUSEEVENTF_MOVE = 0x0001;      移动鼠标
const int MOUSEEVENTF_ABSOLUTE = 0x8000; 标示是否采用绝对坐标
然后按照绝对坐标移动就是
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0);
翻译成VB代码
Public Const MOUSEEVENTF_MOVE = &H1 '  mouse move
Public Const MOUSEEVENTF_ABSOLUTE = &H8000 '  absolute move

mouse_event(MOUSEEVENTF_ABSOLUTE  or  MOUSEEVENTF_MOVE, 500, 500, 0, 0)
然后就不灵光了。觉得匪夷所思,直接帮忙算了一下 MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE = &H8000 or &H1 = &H8001 直接把&H8001写进代码
mouse_event(&H8001, 500, 500, 0, 0)
还是不灵光!!!! 根本的原因在于:VB里十六进制表达结果的自动类型转换。能用两个字节的情况就转成integer,如果超过两个字节不到4个字节的情况转成long。在内存价格高的90年代这种做法是聪明的合理的。但是我们抄C代码的时候要多个心眼。VB的整形都是有符号的。&H8001在转换为intger的时候最高位的符号位是1!!!变成了负数。API调用的时候这个参数要传长整形,于是转换的过程中这个长整形也是负数…… 接下来你在立即窗口里连续做几个试验: print &H8001 :得到-32767 而不是 你想要的 32769 print val(&H8001) : 得到的还是 -32767 而不是 你想要的 32769 print hex(&H8001): 得到 8001 这个看上去理所当然。 print hex(-32767):得到 8001 如果上面三行好理解那么这个也好理解了。 print hex(32769):得到 8001 有没有想骂娘?但你又骂不出来,这个也对啊。 print hex(val(&H8001)):得到 FFFF8001 不是你想像的8001,想掀桌子了是吧(╯‵□′)╯︵┻━┻ 这就是你调用失败的原因!! 废话那么多,如果脑袋一时半会儿绕不过来,直接给解决方法: 直接用十进制声明一个常量
Public Const MOUSEEVENTF_ABSOLUTE_MOVE = 32769 '适用于VB的绝对移动参数
接下来直接调用这个常数:
mouse_event(MOUSEEVENTF_ABSOLUTE_MOVE , 500, 500, 0, 0)
「已注销」 2021-01-10
  • 打赏
  • 举报
回复
为什么在Win10下无效不清楚,你可以尝试将其暂时改为 Call Mouse(&H8001,mw,mh,0,0) 理论讲Or不可能不能识别(&H8001 = &H8000 Or &H1) 或者尝试更换参数试一下 另 Or是位运算,&是字符连接符,其意义应该是不一样的 与Or相对应的是And Xor Not这三个 此处Or表示 采取绝对坐标模拟鼠标移动 不明白你为什么想将Or改为 & 具体,你可以尝试写一个程序输出 Or 连接、&连接、与And连接的结果,看一下区别

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧