我有一个远程屏幕,它占据鼠标位置,然后将位置转换为捕获的屏幕位置,但位置始终关闭。我不是数学上最伟大的,但我确信我的转换是正确的。与屏幕相关的图像大小以及窗口大小是正确的。唯一最终被关闭的是我转换后的点击点。
**我也知道我没有错误检查。这有助于提高可读性。
示例:我想点击Screen
点1102x
999y
。 Remote 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
得到的准确度就越低。