C++ WiNIP-SeNDATION意外行为 我有以下代码,使用Visual C++编译器< /P>编译 #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; }

C++ WiNIP-SeNDATION意外行为 我有以下代码,使用Visual C++编译器< /P>编译 #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; },c++,winapi,mouseevent,C++,Winapi,Mouseevent,使用MOUSEEVENTF_绝对标志并将点转换为鼠标坐标0到0xFFFF以设置鼠标坐标。否则,x/y坐标被视为相对位置 如果指定了MOUSEEVENTF_绝对值,则dx和dy包含 0和65535之间的标准化绝对坐标。事件 过程将这些坐标映射到显示曲面上。坐标 0,0映射到显示曲面的左上角, 6553565535映射到右下角 如果未指定MOUSEEVENTF_绝对值,则指定dx和dy 上次鼠标事件生成时的相对运动 上次报告的位置。正值表示鼠标向右移动 或向下;负值表示鼠标向左或向上移动 相对鼠标运

使用MOUSEEVENTF_绝对标志并将点转换为鼠标坐标0到0xFFFF以设置鼠标坐标。否则,x/y坐标被视为相对位置

如果指定了MOUSEEVENTF_绝对值,则dx和dy包含 0和65535之间的标准化绝对坐标。事件 过程将这些坐标映射到显示曲面上。坐标 0,0映射到显示曲面的左上角, 6553565535映射到右下角

如果未指定MOUSEEVENTF_绝对值,则指定dx和dy 上次鼠标事件生成时的相对运动 上次报告的位置。正值表示鼠标向右移动 或向下;负值表示鼠标向左或向上移动

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

对SendInput中的第二个参数使用数组


DPI虚拟化是reason@DavidHeffernan你能详细说明一下吗?我是一个真正的新手,我找不到任何关于DPI虚拟化对鼠标事件影响的文档。只是不要硬编码960和540。调用GetSystemMetrics获取屏幕大小,除以2将鼠标置于中间。现在您已经编写了适用于任何机器的dpiAware代码,无论屏幕大小以及DPI虚拟化是开还是关。@HansPassant我查询了GetSystemMetrics的屏幕宽度和高度,它们确实是1920x1080。我把代码改成了width/2和height/2,但运气不好,结果还是1243,699@ShawnLi:您的坐标正在膨胀约1.29%。我觉得DPI正在扩展。在MSDN和文档中阅读DPI对鼠标的影响。例如,DPI设置为120使用大小为1.25像素的倾斜。隐马尔可夫模型。。。您的应用程序中是否有DPI感知清单,或使用SetProcessDpiAware/SetProcessDpiAware?如果没有,尝试添加它。是的,使用绝对标志肯定会给我预期的结果。然而,有什么原因导致鼠标的相对运动不能按预期的那样工作吗?我希望它最终会出现在中心。你似乎不理解文档,或者你不理解相对运动和相对运动的含义。screenWidth/2不会以相对运动的中心结束,除非初始位置为0,0。你的代码中清楚地表明你打算使用精确的屏幕坐标。正如你从我的输出中看到的。在SendInput之前,我的光标处于0,0。请参阅有关相对位置的文档相对鼠标运动取决于鼠标速度和加速度级别的设置……啊,是的,是鼠标速度和加速度级别造成的
0 0
1243 699
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;
}