4

我有我的功能在这里工作,但我肯定会以错误的方式进行。

我的程序使用 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 窗口,鼠标仍然会点击正确的位置。

4

3 回答 3

7

改为使用SendInput(),然后您可以使用标志相对于窗口移动光标 -

Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;

  1. 如何使用 SendInput 在 x、y 坐标上模拟双击窗口(i khow 句柄)?
  2. http://www.cplusplus.com/forum/windows/97017/
于 2013-08-04T20:59:30.910 回答
3

如果您单击的窗口位于另一个线程/进程中,则此方法存在根本缺陷,因为在您发送点击时窗口可能会移动 - 这意味着即使您有正确的开始位置也不能保证所有点击最终会在同一个地方。

ClientToScreen话虽如此,您可以使用API 函数将客户端相对坐标转换为屏幕坐标:

POINT pt = { 100, 100 };
ClientToScreen(main_client, &pt);

根据目标窗口,您可能会发现您可以简单地发布一条WM_LBUTTONDBLCLK消息以在适当的位置模拟输入:

PostMessage(main_client, WM_LBUTTONDBLCLK, MK_LBUTTON, MAKELPARAM(100, 100));
于 2013-08-04T21:01:26.823 回答
2

SetCursor()需要屏幕坐标,因此您需要计算双击在屏幕坐标中相对于窗口当前屏幕位置的位置。您可以通过以下任一方式做到这一点:

  1. 用于GetWindowRect()检索窗口的当前屏幕坐标,然后将其偏移预期的相对坐标。

  2. 使用ClientToScreen()orMapWindowPoints()将相对坐标转换为屏幕坐标。

获得预期的屏幕坐标后,您可以将它们传递给SetCursor().

于 2013-08-04T21:05:13.537 回答