c ++ winapi SendInput意外行为

时间:2017-11-16 21:04:04

标签: c++ winapi mouseevent

我有以下代码,使用Visual C ++编译器

编译
#include<iostream>
#include<Windows.h>

using namespace std;

int main() {
    SetProcessDPIAware();

    POINT p;
    GetCursorPos(&p);
    cout << p.x << " " << p.y << endl;

    int screenWidth = GetSystemMetrics(SM_CXSCREEN);
    int screenHeight = GetSystemMetrics(SM_CYSCREEN);

    INPUT in;
    in.type = INPUT_MOUSE;
    in.mi = {
        screenWidth / 2,
        screenHeight / 2,
        0,
        MOUSEEVENTF_MOVE,
        0,
        NULL
    };

    SendInput(1, &in, sizeof(in));

    GetCursorPos(&p);
    cout << p.x << " " << p.y << endl;

    return 0;
}

我的显示是1920x1080。从doc来看,似乎如果我使用相对运动(我在这种情况下),dx和dy应该是像素的差异。

当我运行此代码时,我将光标放在显示器的左上角,我希望它最终位于中心位置,但最终位于(1243,699),经过中心。无法弄清楚原因。

2个cout的确切读数是

0 0
1243 699

1 个答案:

答案 0 :(得分:0)

使用MOUSEEVENTF_ABSOLUTE标记并将点转换为鼠标坐标(00xFFFF)以设置鼠标坐标。否则,x / y坐标被视为相对位置。

  

mouse_event

     

如果指定了MOUSEEVENTF_ABSOLUTE值,则dx和dy包含   065,535之间的归一化绝对坐标。事件   程序将这些坐标映射到显示表面上。坐标   (00)映射到显示表面的左上角,   (6553565535)映射到右下角。

     

如果未指定MOUSEEVENTF_ABSOLUTE值,则dxdy会指定   从最后一个鼠标事件生成时的相对运动(   上次报道的位置)。正值表示鼠标向右移动   (或向下);负值表示鼠标向左(或向上)移动。

     

相对鼠标移动受鼠标速度和设置的限制   加速水平。最终用户使用鼠标设置这些值   控制面板中的应用程序应用程序获取并设置这些   具有SystemParametersInfo函数的值...

将数组用于SendInput

中的第二个参数
int main() 
{
    SetProcessDPIAware();

    POINT p;
    GetCursorPos(&p);
    cout << p.x << " " << p.y << endl;

    int screenWidth = GetSystemMetrics(SM_CXSCREEN);
    int screenHeight = GetSystemMetrics(SM_CYSCREEN);
    cout << screenWidth << " " << screenHeight << endl;

    p.x = screenWidth / 2;
    p.y = screenHeight / 2;

    INPUT in[1] = { 0 };
    in[0].type = INPUT_MOUSE;
    in[0].mi.dx = (p.x * 0xFFFF) / (GetSystemMetrics(SM_CXSCREEN) - 1);
    in[0].mi.dy = (p.y * 0xFFFF) / (GetSystemMetrics(SM_CYSCREEN) - 1);
    in[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;

    SendInput(1, in, sizeof(INPUT));

    GetCursorPos(&p);
    cout << p.x << " " << p.y << endl;

    return 0;
}