我无法测试不同的Windows版本,但我怀疑它是Windows 8问题(由于角落和侧面热点)。
我正在尝试使用来自Autohotkey和AutoIt的SendInput
,SetCursorPos
,mouse_event
和MoveMouse
将光标移动到指定的坐标。它在同一台显示器上移动光标时有效,但在穿过显示器时则无效。
当穿过监视器时,如果我的鼠标光标位于辅助监视器上的(100, 100)
(右侧),则移动到(0, 0)
(主监视器)将移动并保持在那里。 GetCursorPos
会告诉我它在(0, 0)
。但是当我移动时,光标从辅助监视器上的(0, 0)
开始。
如何将光标移动到显示器上,而不是再次跳转到原始显示器?
SendInput示例C ++:
int MouseMove(int x, int y) {
int screenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
int screenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);
INPUT input;
input.type = INPUT_MOUSE;
input.mi.dx = round((x * 65535) / (screenWidth - 1));
input.mi.dy = round((x * 65535) / (screenHeight - 1));
input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK | MOUSEEVENTF_MOVE;
input.mi.mouseData = 0;
input.mi.time = 0;
input.mi.dwExtraInfo = 0;
return SendInput(1, &input, sizeof(INPUT));
}
AutoHotkey示例:
CoordMode, Mouse, Screen
MouseMove, 0, 0, 0
AutoIt示例:
MouseMove(0, 0, 0)
答案 0 :(得分:0)
我无法测试您的问题,但也许我可以指出您正确的方向。
我唯一能想到的是使用MouseGetPos来存储您当前的鼠标位置,SysGet来抓住第二台显示器,然后使用MouseMove将您返回原来的位置SendInput。
希望这有帮助。
答案 1 :(得分:0)
这可能是自动或Windows中的错误。
尝试以不同的方式执行MouseMove并使用$ Window。
Local $WM_MOUSEMOVE = 0x0200
DllCall("user32.dll", "int", "SendMessage", _
"hwnd", WinGetHandle( $Window ), _
"int", $WM_MOUSEMOVE, _
"int", 0, _
"long", _MakeLong($X, $Y))
您的显示器是否设置为扩展模式?