C ++鼠标点击窗口中的某个位置

时间:2013-08-04 20:54:15

标签: c++ c winapi

我的功能在这里工作,但我肯定是错误的。

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

3 个答案:

答案 0 :(得分:6)

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

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

  1. How i can simulate a double mouse click on window ( i khow handle) on x, y coordinate, using SendInput?
  2. http://www.cplusplus.com/forum/windows/97017/

答案 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()需要屏幕坐标,因此您需要计算屏幕坐标相对于窗口当前屏幕位置的双击位置。你可以通过以下任何一种方式做到这一点:

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

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

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