【发布时间】:2018-08-17 13:28:33
【问题描述】:
TL;DR:
我需要同时使用sendmessage 和sendinput 才能进入我无法重新构建的程序中的旧函数/事件。在那里,我无法使用我最初用来进入那里的任何方法释放虚拟鼠标点击——它们被忽略了。
触发 mousedown 事件的任何其他方式 - 我也可以释放鼠标单击的方式可能会起作用。
我正在编写一个程序,它必须与很久以前用 VB6 编写的黑盒旧软件交互。 我的程序必须能够向旧程序发送鼠标点击,特别是 mousedown 和 mouseup 事件。
这是棘手的部分... 旧程序中的 mousedown 事件使用:
While GetAsyncKeyState(1)
Wend
等待用户松开鼠标。
目前,为了让事件触发,我需要使用:
SendMessage(control_handle, WM_LBUTTONDOWN, 0, 0);
Input.type = INPUT_MOUSE;
Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
SendInput(1,&Input,sizeof(INPUT));
这确实触发了事件(仅使用sendmessage 不会触发事件内部的必要分支,因为该分支也是通过GetAsyncKeyState(1) 测试进入的),但发出以下任何组合都不会释放鼠标点击:
SendMessage(control_handle, WM_LBUTTONUP, 0, 0)
Input.type = INPUT_MOUSE;
Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(1,&Input,sizeof(INPUT));
代码只是在 while/wend 部分不断重复,它永远不会退出。发布代码正在发送,但GetAsyncKeyState(1) 没有将其识别为鼠标释放。 GetAsyncKeyState(1) 将函数识别为鼠标按下事件,但 GetAsyncKeyState(1) 不会识别为鼠标按下事件,这非常奇怪。
我测试过的内容:
单击屏幕上其他位置的真实鼠标确实会释放 功能。
-
删除 sendmessage 调用,只使用 sendinput 函数 (并手动将鼠标定位在需要的对象上 单击)确实可以释放循环。
我不能指望用户不乱用鼠标,而这是 做它的事,所以我很犹豫让代码虚拟地移动 将鼠标悬停在要单击的按钮上。
我也尝试过不推荐使用的 mouse_event 函数,完全相同 行为。
时机很关键。在触发器发出和它发生之间不能有很大的延迟。想想键盘响应速度。
我编写了一个非常简单的 VB6 程序来模拟 while/GetAsyncKeyState(1)/wend 循环来测试它,并且行为是相同的 - 所以我可以确信旧程序中没有什么奇怪的东西导致这个发生。
非常感谢您的阅读和帮助!
【问题讨论】:
-
以防万一其他人遇到这种情况......使用 postmessage 而不是 sendmessage 可以让程序继续运行。有道理,真的……
-
有趣的问题。如果您的最后一条评论是指您找到了解决方案,我会说您应该将其添加为下面的真实答案。祝你好运!
标签: c vb6 sendmessage sendinput