AutoHotKey: comportamento de dimensionamento de janela ímpar no Windows 10

2

Eu percebo que este é provavelmente um problema muito obscuro, mas hey é a internet.

Eu tenho um monitor de retrato de 24 ", e eu queria um ajuste vertical. Eu encontrei um script online, mas para a maioria dos tipos de janelas, definir seu tamanho para as dimensões exatas da resolução do monitor fez com que eles fossem um pouco pequenos. ocorre com o Chrome, Edge e até mesmo o Notepad.No entanto, a janela Telegram se comporta como desejado.

A depuração do script AHK mostra que quando Edge é maximizado em um monitor de 1200x1920, o tamanho é na verdade 1216x1896 (vertical é menor para o menu Iniciar, mas ainda é mais alto do que deveria ser).

Eu verifiquei duas vezes as configurações de ajuste de escala do Windows e ele está definido como 100%.

Alguém sabe o que está acontecendo aqui?

No momento, tive que contornar isso fazendo várias inspeções e atribuindo os diferentes métodos a diferentes teclas de atalho.

; 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)
    
por Marlon 15.09.2017 / 02:17

0 respostas