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函数 (并手动将鼠标放在需要的对象上 点击)DOES努力释放循环。
在这种情况下,我不能依赖用户不要弄乱鼠标 做它的事情,所以我犹豫不决让代码虚拟移动 将鼠标悬停在要单击的按钮上。
我也尝试过不推荐使用的mouse_event函数,完全相同 行为。
时机至关重要。发出触发器和发生触发器之间不会有实质性的延迟。想想键盘响应速度。
我写了一个非常简单的VB6程序来模拟while/GetAsyncKeyState(1)/wend
循环来测试它,行为是一样的 - 所以我可以确信在旧程序中没有什么奇怪的东西导致这种情况发生。
非常感谢你阅读和帮助!
答案 0 :(得分:1)
万一有其他任何人出现过....使用postmessage而不是sendmessage可以让程序继续运行。有道理,真的..