gpt4 book ai didi

c - 如何协调被 Getasynckeystate 阻止的 Sendmessage、SendInput、Mouse_event?

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:44 25 4
gpt4 key购买 nike

长话短说:我需要同时使用 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) 未将其识别为鼠标释放。 super 奇怪的是 GetAsyncKeyState(1) 将该函数识别为鼠标按下事件,但 GetAsyncKeyState(1) 不会识别为鼠标弹起事件。

我测试过的内容:

  • 点击屏幕上其他地方的真实鼠标会释放功能。

  • 删除 sendmessage 调用,仅使用 sendingput 函数(并手动将鼠标定位在需要的对象上单击)确实可以释放循环。

    我不能指望用户在这个时候不乱动鼠标做它的事情,所以我犹豫是否让代码实际上移动将鼠标悬停在要单击的按钮上。

  • 我也尝试过已弃用的 mouse_event 函数,完全一样行为。

时机很关键。在触发发出和触发发生之间不能有实质性的延迟。想想键盘响应速度。

我写了一个非常简单的 VB6 程序来模拟 while/GetAsyncKeyState(1)/wend 循环来测试它,并且行为是相同的 - 所以我可以确信没有导致这种情况发生的旧程序中没有什么奇怪的东西。

非常感谢您的阅读和帮助!

最佳答案

以防其他人遇到这种情况......使用 postmessage 而不是 sendmessage 允许程序继续。有道理,真的..

关于c - 如何协调被 Getasynckeystate 阻止的 Sendmessage、SendInput、Mouse_event?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49185903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com