3

似乎我在为调用指定鼠标坐标时遇到了困难mouse_event。无论我如何设置呼叫,我似乎都无法让鼠标正确移动,而且当它移动时,它只会移动到左上角或右下角。pWnd是一个指向我希望在某个时候点击的控件的指针,我目前正在尝试找出坐标系。

任何想法为什么我可以正确移动鼠标?

pWnd->GetWindowRect(&wndRect);

        POINT lpPoint = POINT();
        lpPoint.x = wndRect.left;
        lpPoint.y = wndRect.top;

        ScreenToClient(mainFrm->GetSafeHwnd(), &lpPoint);

        mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE , (DWORD)lpPoint.x, (DWORD)lpPoint.y, 0, 0);
4

1 回答 1

5

使用的坐标mouse_event不对应于窗口像素,它们映射到主监视器上 0 到 65535 的范围。引用MOUSEINPUT结构文档:

如果MOUSEEVENTF_ABSOLUTE指定了 value,dx并且dy包含 0 到 65,535 之间的归一化绝对坐标。事件过程将这些坐标映射到显示表面上。坐标(0,0)映射到显示表面的左上角;坐标 (65535,65535) 映射到右下角。在多显示器系统中,坐标映射到主显示器。

这意味着您需要从窗口坐标转换到这个特殊范围。

DWORD dx = muldiv(x - rectPrimaryMonitor.left, 65535, rectPrimaryMonitor.Width());
DWORD dy = muldiv(y - rectPrimaryMonitor.top, 65535, rectPrimaryMonitor.Height());

您也许可以从等式中消除lefttop,因为我认为主监视器的坐标根据定义是 (0,0)。

如果您在主屏幕上方或左侧的监视器中,我不知道这应该如何工作,因为DWORD它是未签名的。

于 2013-05-16T19:14:26.340 回答