最直接方法是调用setthreadexecutionstate(es_continuous | es_system_required | es_display_required)阻止系统休眠和屏幕关闭,恢复时调用setthreadexecutionstate(es_continuous)。

Windows 上用 SetThreadExecutionState 禁用系统休眠最直接
Windows 不提供“启动休眠”或“强制唤醒”的 API,但能通过抑制系统进入空闲休眠来间接控制——这是绝大多数场景(如播放视频、下载大文件、远程控制)的真实需求。SetThreadExecutionState 是唯一可靠、轻量、无需管理员权限的方案。
常见错误是只传 ES_CONTINUOUS,结果毫无效果:它必须搭配至少一个“状态标识”才生效。
-
ES_SYSTEM_REQUIRED:阻止系统进入睡眠(但允许显示器关闭) -
ES_DISPLAY_REQUIRED:阻止显示器关闭(不影响系统休眠) - 两者同时使用:既保屏幕亮,又保系统不睡
- 务必始终带上
ES_CONTINUOUS,否则只生效一次(比如仅挡下当前空闲周期)
示例:
#include <windows.h> // 阻止系统休眠和显示器关闭 SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED); // 恢复默认行为(让系统可按策略休眠) SetThreadExecutionState(ES_CONTINUOUS); </windows.h>
Linux 下靠 systemd-inhibit 或 D-Bus 接口实现等效抑制
Linux 没有全局“禁用休眠”开关,而是由会话管理器(如 systemd-logind)统一协调。直接写文件或改 sysctl 无效,且可能被桌面环境覆盖。
推荐优先用命令行工具 systemd-inhibit 包裹你的程序:
systemd-inhibit --what=handle-lid-switch:suspend --who="MyApp" --why="Streaming video" ./myapp
若需在 C++ 中调用,得走 D-Bus。关键接口是 org.freedesktop.login1.Manager.Inhibit,参数为:
-
what:填handle-lid-switch:suspend或handle-power-key:suspend(多个用空格分隔) -
who:进程名或描述字符串(纯信息用途) -
why:用户可见原因(如 “Downloading large file”) -
mode:填block(阻塞休眠)或delay(延迟 30 秒再判断)
注意:调用后必须保持 D-Bus 连接活跃,进程退出或连接断开即自动释放抑制。
PyCharm 2026.2.0.1 Windows版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合在Windows系统上进行 Python 项目开发、运行、调试和测试。
macOS 上用 IOAllowPowerChange 和 CFRunLoopPerformBlock 组合控制
macOS 的电源管理由 IOKit 和 CoreFoundation 协同控制。IOAllowPowerChange 是核心函数,但它不能单独调用——必须配合一个“电源变更许可令牌”,该令牌由 IONotificationPortCreate + 注册回调获得,实际开发中过于底层。
更实用的方式是用 CoreFoundation 的运行循环机制,在关键任务期间持续声明“需要电源”:
#include <corefoundation>
#include <iokit>
// 声明系统不应因空闲而休眠(需在主线程 CFRunLoop 中调用)
CFStringRef reason = CFSTR("Audio playback in progress");
IOPMAssertionID assertionID;
IOReturn err = IOPMAssertionCreateWithDescription(
kIOPMAssertionTypeNoDisplaySleep, // 或 kIOPMAssertionTypeNoIdleSleep
reason,
CFSTR("MyApp"),
CFSTR("Playing audio"),
0, nullptr, nullptr, &assertionID
);
if (err == kIOReturnSuccess) {
// 任务结束后调用 IOPMAssertionRelease(assertionID)
}
</iokit></corefoundation>
常见坑:kIOPMAssertionTypeNoIdleSleep 才真正阻止系统休眠;NoDisplaySleep 只保屏幕亮。二者不可混淆。
跨平台封装要注意的三个硬约束
没有跨平台 API 能统一处理休眠控制——Windows 的 SetThreadExecutionState、Linux 的 D-Bus、macOS 的 IOPMAssertion 三者语义不等价,强行抽象会掩盖关键差异。
真正可行的封装思路是定义清晰的行为契约:
- “保活”只承诺“系统在任务执行期间不主动进入休眠”,不承诺唤醒已休眠的机器
- 所有平台都要求显式释放(无 RAII 自动释放,除非你封装了 scoped guard 并确保析构时机可控)
- macOS 和 Linux 需要运行时权限(如 macOS 的 Accessibility 权限对某些 assertion 类型有要求),Windows 则完全不需要
最容易被忽略的是:休眠抑制只影响“空闲触发”的休眠。用户手动点“睡眠”、电池耗尽、盖上笔记本盖子(若 BIOS/UEFI 层未禁用)仍会生效——这些不在应用层控制范围内。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










