Загрузка данных


#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
    )
}