1 (изменено: Clannad5, 2022-09-25 13:46:18)

Тема: AHK: Получить номер монитора, на котором активное окно

Здравствуйте!
При управление своим графическим окном Gui, он иногда изменяет размер(так задумано).

Чтобы при изменение размера окна, он случайно не вышел за пределы видимости монитора, он берёт значение монитора A_ScreenWidht и A_ScreenHeight, получает координаты окна, координаты вычитаются и передвигается в видимую область монитора.

Но оказалось это работает только с одним монитором, если мониторов два и более, то при перемещение Gui на второй монитор, то при изменения размера он прыгает на первый монитор.
Отсюда возникает вопрос:
Как распознавать на каком, в данный момент, мониторе находится мой интерфейс Gui?

Пока что я нахожу координаты так:


    SettingsSound.Show(X Y) ; Вывожу окно
    WinGetPos &X, &Y, &W, &H, "SettingsSound" ; Получаю координаты окна
    Xr := X + W, Yr := Y + H ; Получаю координаты окна х2 и y2
    If Xr > A_ScreenWidth
        {
            Xr := Xr - (Xr - A_ScreenWidth) - W
            SettingsSound.Move(Xr,,,)
}
    If Yr > A_ScreenHeight
        {
        Yr := Yr - (Yr - A_ScreenHeight) - H
    SettingsSound.Move(, Yr,,)
        }

Сразу отмечу что код написан на Ahk V2, но я не прошу обязательной помощи именно по этой версии, мне хотя бы помочь на AHK_L, а дальше я сам преобразую в V2.
Проблема кроется в том, что рабочая область Windows не измеряется в пикселях, можно указать хоть x := 1000000 и хранить окна за рабочим столом, тогда как A_Screen Width/Height имеет координаты только текущего монитора.

Upd, нашел решение:


    SettingsSound.Show(X Y)
    WinGetPos &X, &Y, &W, &H, "SettingsSound"
    Xr := X + W, Yr := Y + H
    totalWidth := SysGet(78) ; Вся рабочая область всех мониторов по ширине
    totalHeight := SysGet(79) ; Вся рабочая область всех мониторов по высоте
    If Xr > totalWidth
        {
            Xr := Xr - (Xr - totalWidth) - W
            SettingsSound.Move(Xr,,,)
}
    If Yr > totalHeight
        {
        Yr := Yr - (Yr - totalHeight) - H
    SettingsSound.Move(, Yr,,)
        }