
Когда я подключен к внешнему дисплею, я хотел бы закрыть ноутбук, не переходя в спящий режим. Когда я не подключен к внешнему дисплею, я хотел бы, чтобы закрытие крышки переводило ноутбук в спящий режим.
Я знаю, что могу добиться этого, вручную переключая настройки питания, но мне бы хотелось что-то автоматическое. Есть идеи? Можно ли отслеживать подключение внешнего дисплея?
Windows 10
решение1
Определите (или создайте, если необходимо) две схемы питания: одну с включенной кнопкой спящего режима, другую — с выключенной.
С помощью команды
powercfg /l
определите GUID этих схем.Установите 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 решение сработало, однако при удалении внешнего дисплея он не возвращается к исходным настройкам питания. Вот как я это сделал.
- Создайте план электропитания, который отключает спящий режим при закрытой крышке.
- Создайте схему электропитания, которая НЕ отключает спящий режим при закрытии крышки.
- Установить 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 */
}