Определение того, на каком мониторе находится курсор с помощью AutoHotKey. Неверное нижнее значение монитора

Я хочу иметь возможность определить, на каком мониторе находится курсор. В идеале это было бы динамическое решение для любого количества/конфигурации мониторов.

Я подумал, что будет просто прочитать границы каждого монитора и проверить, находится ли курсор в указанных границах.

CoordMode, Mouse, Screen
GetMonitorMouse()
{
    MouseGetPos, x, y

    SysGet, Mon1, Monitor, 1
    SysGet, Mon2, Monitor, 2
    SysGet, Mon3, Monitor, 3

    if(x >= Mon1Left && x <= Mon1Right && y >= Mon1Bottom && y <= Mon1Top)
    {
        TrayTip,,monitor1, 1, 16
        SetTimer, TurnOffTrayTip, 500
    }
    else if(x >= Mon2Left && x <= Mon2Right && y >= Mon2Bottom && y <= Mon2Top)
    {
        TrayTip,,monitor2, 1, 16
        SetTimer, TurnOffTrayTip, 500
    }
    else if(x >= Mon3Left && x <= Mon3Right && y >= Mon3Bottom && y <= Mon3Top)
    {
        TrayTip,,monitor3, 1, 16
        SetTimer, TurnOffTrayTip, 500
    }
    else
    {
        TrayTip,,monitor unknown %x%-%y%, 1, 16
        SetTimer, TurnOffTrayTip, 500
        SplashTextOn, 400, 300, CursorMonitor, monitor unknown %x%-%y% # %Mon1top% ~ %Mon1Bottom% $ %Mon1Left% ~ %Mon1Right% 
    }

 sleep, 3000
 GetMonitorMouse()

}

GetMonitorMouse()

TurnOffTrayTip:
TrayTip
return

Однако я не понимаю границ, возвращаемых SysGet. Нижняя граница выглядит произвольной. Например, Mon1Bottom — это -8, а Mon2Bottom — это 352.

Ниже приведено изображение, показывающее расположение трех моих мониторов в том виде, в каком их видит Windows. Зеленым я показываю границы, которые возвращает SysGet (сверху, снизу, слева, справа). Красным цветом я показываю реальные размеры дисплея.

Макет монитора

Я не знаю, как проверить, на каком мониторе находится мой курсор. Кто-нибудь знает, как я могу исправить свой скрипт? Я использую Windows 10.


person Bort    schedule 03.04.2019    source источник
comment
Просто кое-что, что я заметил, пока не копая слишком глубоко: на картинке кажется, что зеленые размеры могут быть заменены местами для мониторов 2 и 3. Так что также может быть, что номер монитора, который извлекает SysGet, не обязательно соответствует настройкам дисплея Windows.   -  person EJE    schedule 03.04.2019
comment
Какой монитор является вашим основным дисплеем в Windows? Основываясь на вашей картинке и моем комментарии выше, я предполагаю, что это № 2.   -  person EJE    schedule 03.04.2019
comment
@EvanElrod - Мой основной дисплей - номер 1. И да, кажется, 2 и 3 поменялись местами. Но я все еще не понимаю, что означают эти цифры. Если Y монитора 2 находится в диапазоне от 0 до 1080, то почему монитор 1 имеет значение от -1088 до -8? У меня болит голова от всего этого, потому что положение курсора измеряется от нижнего левого угла, а мониторы измеряют от верхнего левого угла.   -  person Bort    schedule 03.04.2019
comment
Я полагаю, что положение курсора также измеряется от верхнего левого угла — по крайней мере, так оно отображается в Window Spy.   -  person EJE    schedule 03.04.2019
comment
Если mon1 — ваш основной дисплей, то я думаю, что зеленые размеры для № 3 — для № 1, № 1 — для № 2, а № 2 — для № 3. Я думаю, что у меня может быть ответ для вас через некоторое время, когда я буду дома и смогу посвятить этому некоторое время.   -  person EJE    schedule 03.04.2019
comment
@EvanElrod - Ты прав; Исходная точка Y для курсора также находится в левом верхнем углу.   -  person Bort    schedule 04.04.2019


Ответы (1)


Похоже, ваш скрипт в порядке. Основываясь на приведенных выше комментариях, вот более точное описание вашей установки.

Настройка монитора

Итак, я думаю, что все сводится к тому, «почему нижний край монитора 2 Y-8?» Я думаю, что это могло быть случайно помещено таким образом. Чтобы исправить это, я бы попробовал следующее:

  1. переместить монитор 3 в космос;
  2. переместите монитор 2 вверх и в сторону, а затем переместите его прямо над монитором 1 (как, вероятно, и предполагалось изначально);
  3. наконец, переместите монитор 3 так, чтобы его верхний край совпадал с верхним краем монитора 2.

Теперь, что касается имен мониторов из SysGet, они могут совпадать или не совпадать с тем, как он идентифицируется в настройках дисплея Windows. Я думаю, вам просто нужно сначала определить, какой монитор какой, с тестированием и приступить к этому.

person EJE    schedule 04.04.2019
comment
Отлично, значит все не так плохо, как я думал. Оказывается, мне нужно было поменять местами верхнее и нижнее значения в условном выражении (потому что начало координат находится вверху). Вот почему он всегда выполнялся последним else. (Неизвестный монитор). Что касается знания того, какой монитор есть какой, то в этом может и не быть необходимости. - person Bort; 04.04.2019
comment
ОК, теперь меня интересуют 8-пиксельные координаты Y между монитором 1 и монитором 2. Почему m2 не начинается с 0 или -1? Я не вижу проблемы с координатами X между m1 и m3. Есть идеи? - person Yane; 04.04.2019
comment
@Yane Я думаю, что обычно так и было бы, но, возможно, это было случайно размещено так. Возможно, m3 был помещен перед m2, а m2 был размещен таким образом, что привязывался к верхнему краю m3, а не m1. Поскольку m3 мог находиться очень близко к желаемому местоположению (всего в 8 пикселях), он мог остаться незамеченным до того момента, когда он вообще был выключен. - person EJE; 05.04.2019