Мышь перемещается в исходное местоположение после пересечения Montiors с SendInput и аналогичными функциями

Примечание. Хотя я не могу выполнить тестирование на другой версии Windows, я подозреваю, что это проблема только для Windows 8 из-за угловых и боковых точек доступа.

Я пытаюсь переместить курсор к указанным координатам, используя много методов, таких как SendInput, SetCursorPos, mouse_event а также MoveMouse от AutoHock /AutoIt. Он прекрасно работает при перемещении курсора из одного места в другое на том же мониторе, но не при переходе с одного монитора на другой.

При пересечении монитора, если мой курсор мыши находится в (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));
}

Пример AHK:

CoordMode, Mouse, Screen
MouseMove, 0, 0, 0

Пример AutoIt:

MouseMove(0, 0, 0)

2 ответа

Это может быть ошибка в 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))

Ваши мониторы установлены в режим расширения?

У меня нет возможности проверить вашу проблему, но, возможно, я могу указать вам верное направление.

Единственное, о чем я могу думать, - это использовать MouseGetPos для сохранения текущей позиции мыши, SysGet для захвата 2-го монитора и использовать MouseMove, чтобы вернуть вас в исходное положение после SendInput.

Надеюсь это поможет.

Другие вопросы по тегам