C++ 如何在背景窗口中移动鼠标?

C++ 如何在背景窗口中移动鼠标?,c++,winapi,C++,Winapi,我想在背景窗口中使用键盘和鼠标(窗口是dx窗口) 按“3”键,鼠标单击成功。但我移动鼠标失败。移动鼠标会导致windows将消息发送到拥有鼠标光标正下方窗口的线程的输入队列(除非使用SetCapture捕获鼠标)。但是发布消息不会导致鼠标移动。您可能必须使用SendInput windows API来实现硬件输入的模拟。由于鼠标输入与鼠标光标正下方的窗口关联的方式,您可能需要将窗口置于前面,然后调用SendInput。键盘输入模拟将只进入前景中的窗口。也可以使用SendInput模拟键盘输入 但

我想在背景窗口中使用键盘和鼠标(窗口是dx窗口)


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

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


但通常由于编辑和其他窗口控件处理键盘消息的方式——比如当它们得到WM_键时,将闪烁的光标向下移动一个字符——您通常可以通过手动发布消息来缩短它们。这种短路通常不适用于鼠标消息,因为窗口在收到WM_MOUSEMOVE for 10,20时不会将鼠标移动到位置10,20,而是希望鼠标位于该位置。还有许多其他原因使得post消息方法无法用于鼠标输入

WM_MOUSEMOVE
将为鼠标光标下方的窗口生成消息,而不管它是否为前景窗口
WM_MOUSEMOVE
(如
WM_TIMER
WM_PAINT
)消息不会发布到线程的消息队列。当线程的消息队列为空且线程调用
GetMessage
时,它们会动态生成。如果窗口似乎没有接收
WM_MOUSEMOVE
消息,可能是因为消息队列从未完全排空

重定向键盘输入是一个非常奇怪的概念。用户希望键盘输入进入前台窗口。事实上,前景窗口如下所示:

用户当前使用的窗口


重定向键盘输入涉及使用截取输入来安装或。必须记录输入并随后发送到所需目标。操作系统不支持这一点,并且会以或多或少微妙的方式出现故障(例如,请参阅)。系统控制的内部状态也将不同步,类似的功能将返回不匹配的结果。

我想在后台窗口中使用键盘和鼠标,而不是在前台。
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);