#Requires AutoHotkey v2.0
; Ctrl + Alt + стрелка вверх -> экран вверх ногами
^!Up::RotateScreen(180)
; Ctrl + Alt + стрелка вниз -> обычное положение
^!Down::RotateScreen(0)
RotateScreen(angle)
{
static DMDO_DEFAULT := 0
static DMDO_90 := 1
static DMDO_180 := 2
static DMDO_270 := 3
static dmSize := 220
devmode := Buffer(dmSize, 0)
; dmSize
NumPut("Short", dmSize, devmode, 68)
; Получаем текущие настройки основного монитора
DllCall(
"EnumDisplaySettingsW",
"Ptr", 0,
"Int", -1,
"Ptr", devmode
)
width := NumGet(devmode, 172, "UInt")
height := NumGet(devmode, 176, "UInt")
switch angle {
case 0:
orientation := DMDO_DEFAULT
case 90:
orientation := DMDO_90
case 180:
orientation := DMDO_180
case 270:
orientation := DMDO_270
}
; При переходе между горизонтальным и вертикальным режимом
; необходимо менять ширину и высоту местами
current := NumGet(devmode, 84, "UInt")
if ((current & 1) != (orientation & 1)) {
NumPut("UInt", height, devmode, 172)
NumPut("UInt", width, devmode, 176)
}
; dmDisplayOrientation
NumPut("UInt", orientation, devmode, 84)
DllCall(
"ChangeDisplaySettingsW",
"Ptr", devmode,
"UInt", 0
)
}