【问题标题】:How do I reconcile Sendmessage, SendInput, Mouse_event blocked by Getasynckeystate?如何协调被 Getasynckeystate 阻止的 Sendmessage、SendInput、Mouse_event?
【发布时间】:2018-08-17 13:28:33
【问题描述】:

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 函数 (并手动将鼠标定位在需要的对象上 单击)确实可以释放循环。

    我不能指望用户不乱用鼠标,而这是 做它的事,所以我很犹豫让代码虚拟地移动 将鼠标悬停在要单击的按钮上。

  • 我也尝试过不推荐使用的 mouse_event 函数,完全相同 行为。

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

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

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

【问题讨论】:

  • 以防万一其他人遇到这种情况......使用 postmessage 而不是 sendmessage 可以让程序继续运行。有道理,真的……
  • 有趣的问题。如果您的最后一条评论是指您找到了解决方案,我会说您应该将其添加为下面的真实答案。祝你好运!

标签: c vb6 sendmessage sendinput


【解决方案1】:

以防万一其他人遇到这种情况......使用 postmessage 而不是 sendmessage 可以让程序继续运行。有道理,真的..

【讨论】:

    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多