Отключение спящего режима при подключении внешнего дисплея

Отключение спящего режима при подключении внешнего дисплея

Когда я подключен к внешнему дисплею, я хотел бы закрыть ноутбук, не переходя в спящий режим. Когда я не подключен к внешнему дисплею, я хотел бы, чтобы закрытие крышки переводило ноутбук в спящий режим.
Я знаю, что могу добиться этого, вручную переключая настройки питания, но мне бы хотелось что-то автоматическое. Есть идеи? Можно ли отслеживать подключение внешнего дисплея?
Windows 10

решение1

  1. Определите (или создайте, если необходимо) две схемы питания: одну с включенной кнопкой спящего режима, другую — с выключенной.

  2. С помощью команды powercfg /lопределите GUID этих схем.

  3. Установите AutoHotKey и настройте запуск этого скрипта мониторинга после каждого запуска Windows. Каждый раз при подключении и отключении монитора AutoHotKey будет запускать скрипт для вас, переключая схему питания:

    OnMessage(0x219, "Монитор Сообщений")
    MsgMonitor(wParam, lParam, msg)
    {
        если (wParam = 7) {
            Запустить, powercfg /s 381b4222-f694-41f0-9685-ff5bb260df2e
        } Еще {
            Запустить, powercfg /s 381b4222-0001-2222-3333-0000000000000
        }
        MsgBox проверяет %wParam% и %lParam% и решает запустить программы с %msg%
    }
    ;wParam: 7 lParam: 0 монитор подключен
    ;wParam: 32772 lParam: 8977536 должен быть отключен

Важный:Замените примеры GUID в приведенном выше коде на GUID, которые вы определили на шаге2.

Источники:

решение2

Решение @miroxlav у меня не сработало. Я изменил скрипт следующим образом.

  • Вам все равно придется создать две конфигурации энергосбережения.
  • Скрипт AutoHotKey обычно выполняется при запуске.
  • Перехваченное событие немного отличается (WM_DISPLAYCHANGE)
  • Вам необходимо определить имя вашего основного экземпляра монитора с помощью PowerShell get-WmiObject или диспетчера устройств или...
  • UUID конфигурации питания также жестко запрограммированы в скрипте.
    /*
       Please note that it is not sufficient to count the number of monitors because the
       main monitors goes off line when you close the lid.
       Which resets the count to... 1
       So instead, we just make our decision on the presence of a different monitor than the known
       main one (hardcoded id, SN is a poor criterion).
    */

    /*  
        Subscribe to windows event
        0x7E = WM_DISPLAYCHANGE
    */
    OnMessage(0x7E, "MsgMonitor")

    MsgMonitor(wParam, lParam, msg) {

    /* Sleep 2 sec because there is a delay before display is known to WMI */
    Sleep 2000

    /* default */
    strComputer := "."

    /* This is the one for my PC... */
    myMonitor := "DISPLAY\LGD056E\4&13419694&0&UID265988_0"

    objWMIService := ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" . strComputer . "\root\wmi")
    colItems := objWMIService.ExecQuery("Select * FROM WMIMonitorID")._NewEnum

    hasExternal := false

    While colItems[objItem]
    if objItem.instanceName != myMonitor {
        hasExternal := True
    }

    if ( hasExternal ) {
        /* this is the power config that does not set laptop to sleep on lid closing */event
        Run, powercfg /s a48ebd52-0590-400d-b032-ac7f4302c0e1
    } Else {
        /* this instead is the power config that does set laptop to sleep on lid closing event */
        Run, powercfg /s 377a8558-bff4-4f51-ab43-626b1aa5a65f
    }

}

решение3

@miroxlav решение сработало, однако при удалении внешнего дисплея он не возвращается к исходным настройкам питания. Вот как я это сделал.

  1. Создайте план электропитания, который отключает спящий режим при закрытой крышке.
  2. Создайте схему электропитания, которая НЕ отключает спящий режим при закрытии крышки.
  3. Установить AutoHotKey

Откройте блокнот и вставьте код ниже. Сохраните как AHK и запустите.

Этот скрипт autohotkey определяет количество мониторов и основной монитор. Если количество мониторов больше 1, то он изменит настройки питания. Не забудьте вставить соответствующие схемы питания.

Если это сработает, вы можете запустить этот скрипт при загрузке, нажав Win + R, затем ввести shell:startupи вставить скрипт.

OnMessage(0x219, "MsgMonitor")
     MsgMonitor(wParam, lParam, msg)
     {

        SysGet, MonitorCount, MonitorCount
        SysGet, MonitorPrimary, MonitorPrimary

        count := 0
        Loop, %MonitorCount%
        {
            count++
        }

        IfLessOrEqual, count, 1
            Run, powercfg /s c7046c63-d4a3-4246-910c-c994cd704433 /* no external monitor power setting */
        Else
            Run, powercfg /s 3791f438-87b9-4243-89a1-00c797e02c84 /* external monitor connected */
     }

Связанный контент