新PC仅支持S0 Modern Standby,如何通过Windows API仅关闭显示器?
解决S0模式下仅关闭显示器的Windows API方案
在仅支持Modern Standby(S0)的设备上,要实现仅关闭显示器、系统保持活跃(如同电源设置中“X分钟无操作后关显示器”的状态),可以通过以下步骤实现:
核心思路
系统默认的SendMessage(WM_SYSCOMMAND, SC_MONITORPOWER, 2)在S0设备上可能被OEM或系统策略映射到Modern Standby的浅睡眠状态,导致风扇运行、系统进入低功耗但仍可能影响后台任务。要避免这种情况,需要先强制系统保持活跃,再触发显示器关闭。
具体实现代码
关闭显示器(同时保持系统活跃)
#include <Windows.h> void TurnOffMonitorOnly() { // 告诉系统当前有活跃任务,禁止进入睡眠/Modern Standby SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED); // 向桌面窗口发送关闭显示器的命令,确保对全系统生效 SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_MONITORPOWER, 2); }
恢复显示器
void TurnOnMonitor() { // 恢复显示器 SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_MONITORPOWER, -1); // 重置系统睡眠策略为默认设置 SetThreadExecutionState(ES_CONTINUOUS); }
关键API说明
SetThreadExecutionState:通过ES_SYSTEM_REQUIRED标记告知系统当前有需要持续运行的任务,阻止进入Modern Standby;ES_CONTINUOUS表示该设置会持续生效,直到再次调用重置。SendMessage(GetDesktopWindow(), ...):向系统桌面窗口发送命令,确保操作覆盖所有显示器,而非仅当前程序窗口。SC_MONITORPOWER参数中,2代表关闭显示器,-1代表重新开启。
验证与注意事项
- 确保系统电源设置中“睡眠”选项设为从不,避免系统自动触发Modern Standby。
- 若仍出现异常,可尝试添加
ES_AWAYMODE_REQUIRED标记(适用于Windows Vista及以上),该标记会让系统进入“离开模式”——显示器关闭,但后台任务仍能正常运行,适合备份、下载等持续任务场景:SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);
内容的提问来源于stack exchange,提问作者vdawg
相关产品推荐
相关产品推荐

