我的功能在这里工作,但我肯定是错误的。
我的程序使用FindWindow来查找正确的窗口。我需要双击此窗口中的特定位置。
我通过始终将窗口放在屏幕上的相同位置来使其工作,但如果我移动窗口,程序将尝试单击我提供的硬编码位置,它将无法工作。
这是功能:
void lobbyWindow(HWND main_client)
{
//RECT arect;
// GetWindowRect(main_client, &arect);
SetCursorPos(748,294);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}
如您所见,我只需将鼠标移动到748,294并双击即可。我想要做的是在main_client窗口中将鼠标设置为100,100,所以如果我移动main_client窗口,鼠标仍然会点击正确的位置。
答案 0 :(得分:6)
使用SendInput()
代替,然后您可以使用标志相对于窗口移动光标 -
Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;
答案 1 :(得分:3)
如果您点击的窗口在另一个线程/进程中,这种方法存在根本缺陷,因为窗口可以在您发送点击时移动 - 这意味着即使您有正确的位置可以启动在那里,并不能保证所有点击都会在同一个地方结束。
话虽如此,您可以使用ClientToScreen
API函数将客户相对坐标转换为屏幕坐标:
POINT pt = { 100, 100 };
ClientToScreen(main_client, &pt);
根据目标窗口,您可能会发现只需发布WM_LBUTTONDBLCLK
消息即可在适当的位置模拟输入:
PostMessage(main_client, WM_LBUTTONDBLCLK, MK_LBUTTON, MAKELPARAM(100, 100));
答案 2 :(得分:2)
SetCursor()
需要屏幕坐标,因此您需要计算屏幕坐标相对于窗口当前屏幕位置的双击位置。你可以通过以下任何一种方式做到这一点:
使用GetWindowRect()
检索窗口的当前屏幕坐标,然后按预期的相对坐标偏移。
使用ClientToScreen()
或MapWindowPoints()
将相对坐标转换为屏幕坐标。
获得预期的屏幕坐标后,您可以将其传递给SetCursor()
。