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)