SendInput始终将鼠标指针移动到左上角

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SendInput始终将鼠标指针移动到左上角相关的知识,希望对你有一定的参考价值。

我想以编程方式将鼠标运动合成到屏幕上的点(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调用遵循documented行为:

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;
}

以上是关于SendInput始终将鼠标指针移动到左上角的主要内容,如果未能解决你的问题,请参考以下文章

js如何获取鼠标在某元素移动时~鼠标指针在元素中的坐标?

第七章 鼠标(CHECKER2)

为啥鼠标不能超过电脑屏幕的左,上边界,而能够超过

如何正确使用 SendInput() 在 C# 中模拟鼠标输入

VB里怎样让鼠标指针移动到按钮上时弹出提示对话框

Qt设置窗口可拖动