Zdaję sobie sprawę, że to prawdopodobnie bardzo niejasny problem, ale hej, to Internet.

Mam 24-calowy monitor portretowy i chciałem przyciągać w pionie. Znalazłem skrypt online, ale dla większości typów okien ustawienie ich rozmiaru na dokładne wymiary rozdzielczości monitora spowodowało, że były nieco za małe. Dzieje się tak w przypadku Chrome , Edge, a nawet Notatnik. Jednak okno Telegram zachowuje się zgodnie z potrzebami.

Debugowanie skryptu AHK pokazuje, że gdy Edge jest zmaksymalizowany na monitorze 1200x1920, jego rozmiar to w rzeczywistości 1216x1896 (pion jest mniejszy, biorąc pod uwagę menu startowe, ale nadal jest wyższy niż powinien).

Dwukrotnie sprawdziłem ustawienia skalowania wyświetlania okien i na pewno jest ustawione na 100%.

Czy ktoś wie, co się tutaj dzieje?

W tej chwili musiałem się obejść, przeprowadzając różne kontrole i przypisując różne metody do różnych klawiszy skrótu.

; 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)
Marlon
źródło