SendInput 总是将鼠标指针移动到左上角

Leo*_*Leo 2 c++ winapi mouseevent

我想用下面的代码以编程方式将鼠标运动合成到屏幕上的一个点 (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;
}
Run Code Online (Sandbox Code Playgroud)

附注。我已经在 Windows 10x64 上的 VS2017 中编译了它。我也在Win7上运行了代码

聚苯乙烯。当我删除 MOUSEEVENTF_ABSOLUTE 标志时,它会移动到相对位置。

IIn*_*ble 6

API 调用遵循记录的行为:

MOUSEEVENTF_ABSOLUTEdxdy成员包含归一化的绝对坐标。[...] 请参阅以下备注部分。

归一化坐标确实在备注部分有描述:

如果MOUSEEVENTF_ABSOLUTE指定了 value,则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;
}
Run Code Online (Sandbox Code Playgroud)