穿过显示器后鼠标移动到原始位置

问题描述 投票:2回答:2

我无法测试不同的Windows版本,但我怀疑它是Windows 8问题(由于角落和侧面热点)。

我正在尝试使用来自Autohotkey和AutoIt的SendInputSetCursorPosmouse_eventMoveMouse将光标移动到指定的坐标。它在同一台显示器上移动光标时有效,但在跨越显示器时则无效。

当穿过监视器时,如果我的鼠标光标位于辅助监视器上的(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)
windows-8.1 multiple-monitors sendinput
2个回答
0
投票

我无法测试你的问题,但也许我可以指出你正确的方向。

我唯一能想到的是使用MouseGetPos存储你当前的鼠标位置,SysGet来获取第二个监视器,并使用MouseMove将你返回到SendInput之后的原始位置。

希望这可以帮助。


0
投票

这可能是Autoit或Windows中的错误。

尝试以不同的方式执行MouseMove并使用$ Window。

Local $WM_MOUSEMOVE     =  0x0200

DllCall("user32.dll", "int", "SendMessage", _
        "hwnd",  WinGetHandle( $Window ), _
        "int",   $WM_MOUSEMOVE, _
        "int",   0, _
        "long",  _MakeLong($X, $Y))

您的显示器是否设置为扩展模式?

© www.soinside.com 2019 - 2024. All rights reserved.