关闭鼠标位置

时间:2017-03-15 04:05:37

标签: c++ winapi

我有一个远程屏幕,它占据鼠标位置,然后将位置转换为捕获的屏幕位置,但位置始终关闭。我不是数学上最伟大的,但我确信我的转换是正确的。与屏幕相关的图像大小以及窗口大小是正确的。唯一最终被关闭的是我转换后的点击点。

**我也知道我没有错误检查。这有助于提高可读性。

示例:我想点击Screen1102x 999yRemote Window点约为676 584。转换后,该点会转换为1081.5 935.3。我可能会理解可能只有几个像素,因为很难通过RW点击那个确切的位置,但它被翻译为60像素和20像素。

让我们说我的远程屏幕是800 x 600,捕获的是1280 x 1024。 得到我使用的差异(1280/800)* Clickpointx和(1024/600)* Clickpointy。

我的问题是sWidth和sHeight总是偏离至少20,有时偏离80以上,具体取决于点击在窗口内的位置。

        POINT p;
        float sWidth;
        float sHeight;
        GetCursorPos(&p);
        RECT rect;
        GetWindowRect(hWnd, &rect); // Get Window Size
        ScreenToClient(hWnd, &p); // convert points relative to screen to points relative to window 
        float wWidth = rect.right - rect.left;
        float wHeight = rect.bottom - rect.top;
        Gdiplus::Image* image = Gdiplus::Image::FromStream(sRemote_Handler.istream); //Get Captured image Size;
        float iWidth = image->GetWidth();
        float iHeight = image->GetHeight();
        INPUT input;
        input.type = INPUT_MOUSE;
        input.mi.time = 0;
        float pointx = p.x; 
        float pointy = p.y;
        sWidth = (iWidth / wWidth)*pointx; // divide image width by screen width
        sHeight = (iHeight / wHeight)*pointy; // divide image height by screen height
        input.mi.dx = sWidth*(65536.0f / iWidth); //convert to pixels
        input.mi.dy = sHeight*(65536.0f / iHeight); // ^
        input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
        SendInput(1, &input, sizeof(input)); // move mouse

我尝试将转换方法更改为(Clickpointx * 1280)/ 800和(Clickpointy * 1240)/ 600。结果仍然相同。

        sWidth = (pointx * iWidth) / wWidth;
        sHeight = (pointy * iHeight) / wHeight;

再次更改了转换方法。相同的结果

        sWidth = (pointx / iWidth)*wWidth;
        sHeight = (pointy / iHeight)*wHeight;

修改

我得出的结论是ScreenToClient windows函数。 当点击右下角应该是800,600附近时,两个值都比它们应该的值小50左右。当我点击左上角时,两个值都应该是它们的位置。这些数字报告为0,1。似乎从最初的0,0点开始越远,ScreenToClient得到的准确度就越低。

0 个答案:

没有答案