Я понимаю, что это, вероятно, действительно неясная проблема, но эй, это Интернет.
У меня 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)