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

mouse_event click coordinates, seems I am lost in coordinate sets

本文关键字:坐标 迷失 event mouse      更新时间:2023-10-16

似乎我在指定呼叫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);

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

指定MOUSEEVENTF_ABSOLUTE value时,dxdy包含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是无符号的。