如何协调Getasynckeystate阻止的Sendmessage,SendInput,Mouse_event?

时间:2018-03-09 02:57:02

标签: c vb6 sendmessage sendinput

TL; DR: 我需要同时使用sendmessagesendinput才能进入我无法重新构建的程序中的旧函数/事件。在那里,我不能使用我过去常常进入的任何方法释放虚拟鼠标点击 - 它们被忽略了。 触发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循环来测试它,行为是一样的 - 所以我可以确信在旧程序中没有什么奇怪的东西导致这种情况发生。

非常感谢你阅读和帮助!

1 个答案:

答案 0 :(得分:1)

万一有其他任何人出现过....使用postmessage而不是sendmessage可以让程序继续运行。有道理,真的..