mouse_event 点击坐标,似乎我迷失在坐标集中

3 c++ mfc

似乎我在指定调用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);
Run Code Online (Sandbox Code Playgroud)

Mar*_*som 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());
Run Code Online (Sandbox Code Playgroud)

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

如果您在主显示器上方或左侧的显示器中,我不知道这应该如何工作,因为DWORD它没有签名。