簡體   English   中英

SendInput始終將鼠標指針移動到左上角

[英]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_ABSOLUTEdxdy成員包含標准化的絕對坐標。 [...]請參閱以下“備注”部分。

備注部分中確實描述了標准化坐標:

如果指定了MOUSEEVENTF_ABSOLUTE值,則dxdy包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM