似乎我在指定调用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)
使用的坐标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)
您可能能够从等式中消除left和top,因为我认为主监视器的坐标根据定义是 (0,0)。
如果您在主显示器上方或左侧的显示器中,我不知道这应该如何工作,因为DWORD它没有签名。