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

时间:2013-09-21 07:24:57

标签: c++ winapi

我想在后台窗口中使用键盘和鼠标(窗口是一个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”,鼠标点击成功。但我移动鼠标失败了。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

无论鼠标光标是否为前景窗口,都会为鼠标光标下方的窗口生成

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

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

  

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

重定向键盘输入涉及使用SetWindowsHookEx拦截输入以安装keyboard hooklow-level keyboard hook。必须记录输入并随后将其发送到所需目标。操作系统不支持此操作,并且会以或多或少的方式失败(例如,请参阅Replaying input is not the same as reprocessing it)。系统控制的内部状态也将不同步,像GetAsyncKeyState这样的函数将返回不匹配的结果。

相关问题