繁体   English   中英

如何在后台窗口中移动鼠标?

[英]How to move mouse in background window?

我想在后台窗口中使用键盘和鼠标(窗口是一个dx窗口)。

HWND myhwnd = GetForegroundWindow();
PostMessage(myhwnd, WM_KEYDOWN, 0x33, 0); //press "3"
PostMessage(myhwnd, WM_KEYUP, 0x33, 0);
LPARAM lParam = MAKELPARAM(300,100);
PostMessage(myhwnd, WM_MOUSEMOVE, 0,lParam); // mouse move
PostMessage(myhwnd, WM_RBUTTONDOWN, 0,lParam); // mouse click
PostMessage(myhwnd, WM_RBUTTONUP, 0, lParam);

按“3”,鼠标点击成功。但我移动鼠标失败了。

移动鼠标会导致窗口将消息发布到拥有直接位于鼠标光标下方的窗口的线程的输入队列中(除非使用SetCapture捕获鼠标)。 但发布消息不会导致鼠标移动。 您可能必须使用SendInput Windows API来实现硬件输入的模拟。 由于鼠标输入与鼠标光标正下方的窗口相关联,您可能必须将窗口置于前面,然后调用SendInput。 键盘输入模拟只会进入前景窗口。 键盘输入也可以使用SendInput进行模拟。

但通常由于像EDIT和其他人一样处理键盘消息的窗口控制方式 - 通过将闪烁的光标移动到一个字符串,当它们获得WM_KEYDOWN时 - 你可以经常通过手动发布消息来短路它们。 这种短路通常不适用于鼠标消息,因为当窗口接收到10,20的WM_MOUSEMOVE时,窗口不会将鼠标移动到位置10,20,而是他们希望鼠标位于该位置。 还有许多其他原因使得帖子消息方法不适用于鼠标输入。

无论是否为前景窗口,都会为鼠标光标下方的窗口生成WM_MOUSEMOVE消息。 WM_MOUSEMOVE (如WM_TIMERWM_PAINT )消息不会发布到线程的消息队列中。 当线程的消息队列为空并且线程调用GetMessage时,它们是动态生成的。 如果窗口似乎没有收到WM_MOUSEMOVE消息,那可能是因为消息队列永远不会完全耗尽。

重定向键盘输入是一个非常奇怪的概念。 用户希望键盘输入转到前台窗口。 实际上,前景窗口定义为:

用户当前正在使用的窗口。

重定向键盘输入涉及使用SetWindowsHookEx拦截输入以安装键盘挂钩低级键盘挂钩 必须记录输入并随后将其发送到所需目标。 操作系统不支持此操作,并且会以或多或少的方式失败(例如,请参阅重播输入与重新处理输入不同 )。 系统控制的内部状态也将不同步,像GetAsyncKeyState这样的GetAsyncKeyState将返回不匹配的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM