2

Я понимаю, что это, вероятно, действительно неясная проблема, но эй, это Интернет.

У меня 24-дюймовый портретный монитор, и я хотел сделать вертикальный снимок. Я нашел онлайн-скрипт, но для большинства типов окон, установив их размер в соответствии с точными размерами разрешения монитора, они оказались немного слишком маленькими. Это происходит с Chrome, Edge и даже Notepad. Однако окно Telegram ведет себя как нужно.

Отладка сценария AHK показывает, что при увеличении Edge на мониторе 1200x1920 размер фактически равен 1216x1896 (по вертикали он меньше для меню «Пуск», но он все же выше, чем должен быть).

Я дважды проверил настройки масштабирования отображения окон, и он определенно установлен на 100%.

Кто-нибудь знает, что здесь происходит?

На данный момент мне пришлось обойти это, выполняя различные проверки и назначая разные методы для разных горячих клавиш.

; dir 0 = top part
; dir 1 = bottom part
; method 0 = funky
; method 1 = exact

ResizeWin(dir = 1, method = 0)
{
    WinGet activeWin, ID, A
    activeMon := GetMonitorIndexFromWindow(activeWin)

    SysGet, MonitorWorkArea, MonitorWorkArea, %activeMon%

    if (method == 0) {
        WinMaximize, A
        WinGetPos, CurWinX, CurWinY, CurWinWidth, CurWinHeight, A
        newWidth := CurWinWidth
        newHeight := CurWinHeight/2
        newLeft := CurWinX

        if (dir == 1)
            newTop := MonitorWorkAreaTop + newHeight + (CurWinY - MonitorWorkAreaTop)
        else
            newTop := MonitorWorkAreaTop
    } else {

        newWidth := MonitorWorkAreaRight - MonitorWorkAreaLeft
        newHeight := (MonitorWorkAreaBottom - MonitorWorkAreaTop)/2
        newLeft := MonitorWorkAreaLeft

        if (dir == 1)
            newTop := MonitorWorkAreaBottom - newHeight
        else
            newTop := MonitorWorkAreaTop    
    }

    WinRestore,A
    WinMove,A,,%newLeft%,%newTop%,%newWidth%,%newHeight%
}

; From http://www.autohotkey.com/board/topic/69464-how-to-determine-a-window-is-in-which-monitor/
GetMonitorIndexFromWindow(windowHandle)
{
    ; Starts with 1.
    monitorIndex := 1

    VarSetCapacity(monitorInfo, 40)
    NumPut(40, monitorInfo)

    if (monitorHandle := DllCall("MonitorFromWindow", "uint", windowHandle, "uint", 0x2)) 
        && DllCall("GetMonitorInfo", "uint", monitorHandle, "uint", &monitorInfo) 
    {
        monitorLeft   := NumGet(monitorInfo,  4, "Int")
        monitorTop    := NumGet(monitorInfo,  8, "Int")
        monitorRight  := NumGet(monitorInfo, 12, "Int")
        monitorBottom := NumGet(monitorInfo, 16, "Int")
        workLeft      := NumGet(monitorInfo, 20, "Int")
        workTop       := NumGet(monitorInfo, 24, "Int")
        workRight     := NumGet(monitorInfo, 28, "Int")
        workBottom    := NumGet(monitorInfo, 32, "Int")
        isPrimary     := NumGet(monitorInfo, 36, "Int") & 1

        SysGet, monitorCount, MonitorCount

        Loop, %monitorCount%
        {
            SysGet, tempMon, Monitor, %A_Index%

            ; Compare location to determine the monitor index.
            if ((monitorLeft = tempMonLeft) and (monitorTop = tempMonTop)
                and (monitorRight = tempMonRight) and (monitorBottom = tempMonBottom))
            {
                monitorIndex := A_Index
                break
            }
        }
    }

    return %monitorIndex%
}

^#Up::ResizeWin(0)
^#Down::ResizeWin(1)
+^#Up::ResizeWin(0, 1)
+^#Down::ResizeWin(1, 1)

0