我有以下代码,使用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
答案 0 :(得分:0)
使用MOUSEEVENTF_ABSOLUTE
标记并将点转换为鼠标坐标(0
至0xFFFF
)以设置鼠标坐标。否则,x / y坐标被视为相对位置。
如果指定了
MOUSEEVENTF_ABSOLUTE
值,则dx和dy包含0
和65,535
之间的归一化绝对坐标。事件 程序将这些坐标映射到显示表面上。坐标 (0
,0
)映射到显示表面的左上角, (65535
,65535
)映射到右下角。如果未指定
MOUSEEVENTF_ABSOLUTE
值,则dx
和dy
会指定 从最后一个鼠标事件生成时的相对运动( 上次报道的位置)。正值表示鼠标向右移动 (或向下);负值表示鼠标向左(或向上)移动。相对鼠标移动受鼠标速度和设置的限制 加速水平。最终用户使用鼠标设置这些值 控制面板中的应用程序应用程序获取并设置这些 具有
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;
}