1,487
社区成员
发帖
与我相关
我的任务
分享
不用这么麻烦 这一句改成 Private Const MOUSEEVENTF_ABSOLUTE = &H8000& 即可
后面加个& 代表长整型
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)