[英]SendInput always moves mouse pointer to left top corner
我想以編程方式將鼠標的運動合成到屏幕上的一個點(100,100),下面的代碼將其移動到左上角。 有什么事嗎
#include "stdafx.h"
#include<Windows.h>
int main() {
INPUT input;
input.type = INPUT_MOUSE;
input.mi.dx = 100;
input.mi.dy = 100;
input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
input.mi.mouseData = 0;
input.mi.dwExtraInfo = NULL;
input.mi.time = 0;
SendInput(1, &input, sizeof(INPUT));
return 0;
}
PS。 我已經在Windows 10x64的VS2017中編譯了它。 我也在Win7上運行了代碼
PPS。 當我刪除MOUSEEVENTF_ABSOLUTE標志時,它移至相對位置。
API調用遵循已記錄的行為:
MOUSEEVENTF_ABSOLUTE : dx和dy成員包含標准化的絕對坐標。 [...]請參閱以下“備注”部分。
備注部分中確實描述了標准化坐標:
如果指定了
MOUSEEVENTF_ABSOLUTE
值,則dx和dy包含0到65,535之間的歸一化絕對坐標。 事件過程將這些坐標映射到顯示表面上。 坐標(0,0)映射到顯示表面的左上角; 坐標(65535,65535)映射到右下角。 在多監視器系統中,坐標映射到主監視器。
要將鼠標移到絕對位置,您首先需要查詢顯示表面的大小(例如,通過調用GetMonitorInfor ),並適當縮放坐標。
給定該點並以設備單位顯示的表面尺寸作為輸入,以下函數可標准化該點:
POINT normalize(POINT const& pt_in_px, RECT const& display_size_in_px)
{
POINT pt_normalized{};
auto const width_in_px{ display_size_in_px.right - display_size_in_px.left };
auto const height_in_px{ display_size_in_px.bottom - display_size_in_px.top };
pt_normalized.x = ::MulDiv(pt_in_px.x, 65536, width_in_px);
pt_normalized.y = ::MulDiv(pt_in_px.y, 65536, height_in_px);
return pt_normalized;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.