【发布时间】:2017-11-16 21:04:03
【问题描述】:
我有以下代码,使用 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
【问题讨论】:
-
DPI 虚拟化是原因
-
@DavidHeffernan 你能详细说明一下吗?我是一个真正的新手,我找不到任何关于 DPI 虚拟化对鼠标事件的影响的文档。
-
只是不要硬编码 960 和 540。调用 GetSystemMetrics() 获取屏幕大小,除以 2 以使鼠标居中。现在,您编写的 dpiAware 代码可以在任何机器上运行,无论屏幕大小以及 DPI 虚拟化是打开还是关闭。
-
@HansPassant 我向 GetSystemMetrics 查询了屏幕宽度和高度,它们确实是 1920x1080。我将代码更改为 width/2 和 height/2 但没有运气,它仍然以 1243,699 结束
-
@ShawnLi:你的坐标膨胀了~1.29%。看起来像 DPI 缩放给我。在 MSDN 的 Mouse Movement 和 DPI and Device-Independant Pixels 文档中了解 DPI 对鼠标的影响。例如,120 的 DPI 设置使用大小为 1.25 像素的 DIP。嗯...您的应用中是否有 DPI 感知清单,或者使用
SetProcessDpiAware()/SetProcessDpiAwareness()?如果没有,请尝试添加。
标签: c++ winapi mouseevent