
Wenn ich an ein externes Display angeschlossen bin, möchte ich den Laptop schließen, ohne dass er in den Ruhezustand wechselt. Wenn ich nicht an ein externes Display angeschlossen bin, möchte ich, dass das Schließen des Deckels den Laptop in den Ruhezustand versetzt.
Ich weiß, dass ich dies erreichen kann, indem ich die Energieeinstellungen manuell ändere, aber ich hätte gerne etwas Automatisches. Irgendeine Idee? Können wir die Verbindung zum externen Display verfolgen?
Windows 10
Antwort1
Bestimmen Sie (oder erstellen Sie bei Bedarf) zwei Energieschemata, eines mit aktivierter und eines mit deaktivierter Standby-Taste.
Bestimmen Sie mithilfe des Befehls
powercfg /l
die GUIDs dieser Schemata.Installieren Sie AutoHotKey und richten Sie dieses Überwachungsskript so ein, dass es bei jedem Start von Windows gestartet wird. Jedes Mal, wenn der Monitor angeschlossen und getrennt wird, führt AutoHotKey das Skript für Sie aus und wechselt das Energieschema:
BeiNachricht(0x219, "MsgMonitor") MsgMonitor(wParam, lParam, msg) { wenn (wParam = 7) { Führen Sie „powercfg /s 381b4222-f694-41f0-9685-ff5bb260df2e“ aus. } Anders { Führen Sie „powercfg /s 381b4222-0001-2222-3333-000000000000“ aus. } MsgBox prüft %wParam% und %lParam% und entscheidet, ob Programme mit %msg% ausgeführt werden sollen } ;wParam: 7 lParam: 0 Monitor angeschlossen ;wParam: 32772 lParam: 8977536 sollte auf getrennt stehen
Wichtig:Ersetzen Sie die Beispiel-GUIDs im obigen Code durch die GUIDs, die Sie in Schritt2.
Quellen:
Antwort2
Die Lösung von @miroxlav hat bei mir nicht funktioniert. Ich habe das Skript wie folgt geändert.
- Sie müssen noch zwei Energiesparkonfigurationen erstellen
- Das AutoHotKey-Skript wird normalerweise beim Start ausgeführt.
- Das abgefangene Ereignis ist etwas anders (WM_DISPLAYCHANGE)
- Sie müssen den Namen Ihrer Hauptmonitorinstanz über Powershell get-WmiObject oder den Geräte-Manager oder ... ermitteln.
- Auch die UUIDs der Energiekonfiguration sind im Skript fest codiert.
/*
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
}
}
Antwort3
Die Lösung von @miroxlav hat funktioniert, aber wenn Sie das externe Display entfernen, wird es nicht auf die ursprüngliche Energieeinstellung zurückgesetzt. So habe ich es gemacht.
- Erstellen Sie einen Energiesparplan, der den Ruhezustand deaktiviert, wenn der Deckel geschlossen ist.
- Erstellen Sie einen Energiesparplan, der den Ruhezustand NICHT deaktiviert, wenn der Deckel geschlossen ist.
- Installieren Sie AutoHotKey
Öffnen Sie den Editor und fügen Sie den folgenden Code ein. Als AHK speichern und ausführen.
Dieses Autohotkey-Skript erkennt die Anzahl der Monitore und den primären Monitor. Wenn die Anzahl der Monitore größer als 1 ist, wird die Energieeinstellung geändert. Vergessen Sie nicht, die entsprechenden Energieschemata einzufügen.
Wenn dies funktioniert, können Sie dieses Skript beim Start ausführen, indem Sie Win + R drücken, dann shell:startup
das Skript eingeben und dort einfügen.
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 */
}