当我连接到外部显示器时,我想关闭笔记本电脑而不让它进入睡眠状态。当我没有连接到外部显示器时,我想关闭盖子让笔记本电脑进入睡眠状态。
我知道我可以通过手动切换电源设置来实现这一点,但我想要一些自动的东西。有什么想法吗?我们可以跟踪外部显示器连接吗?
Windows 10
答案1
确定(或创建,如果需要)两个电源方案,一个启用睡眠按钮,一个禁用。
使用命令
powercfg /l
确定这些方案的 GUID。安装 AutoHotKey 并设置每次启动 Windows 后启动此监控脚本。每次连接和断开监视器时,AutoHotKey 都会为您运行脚本,切换电源方案:
消息监听(0x219,“MsgMonitor”) MsgMonitor(wParam,lParam,msg) { 如果 (wParam = 7) { 运行,powercfg /s 381b4222-f694-41f0-9685-ff5bb260df2e } 别的 { 运行,powercfg /s 381b4222-0001-2222-3333-000000000000 } MsgBox 检查 %wParam% 和 %lParam% 并决定使用 %msg% 运行程序 } ;wParam: 7 lParam: 0 监视器已连接 ;wParam: 32772 lParam: 8977536 应处于断开连接状态
重要的:将上述代码中的示例 GUID 替换为您在步骤中确定的 GUID2。
资料来源:
答案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 */
}