目录
WINdows 11 休眠问题深度解析与解决方案
问题背景
在开发需要长时间持续运行的应用程序时(如工业控制软件、PLC 通信程序、数据采集系统等),经常会遇到以下问题:
根本原因 :Windows 系统进入了休眠或睡眠状态,导致程序暂停或终止运行。
Windows 电源管理机制详解
Windows 提供了多种省电模式,每种模式对程序运行的影响各不相同:
1. 睡眠模式(Sleep / S3)
传统睡眠状态(S3)
工作原理 :
对程序的影响 :
适用场景 :
现代待机(Modern Standby / S0)
工作原理 :
对程序的影响 :
适用场景 :
2. 休眠模式(Hibernate / S4)
工作原理 :
对程序的影响 :
适用场景 :
3. 混合睡眠(Hybrid Sleep)
工作原理 :
对程序的影响 :
4. 快速启动(Fast Startup)
工作原理 :
对程序的影响 :
如何查看系统支持的休眠模式
方法一:使用 PowerShell 命令(推荐)
打开 PowerShell 或 命令提示符 ,输入:
powercfg /a
输出示例解读:
示例 1:笔记本(支持现代待机)
此系统上有以下睡眠状态:待机 (S0 低电量待机) 连接的网络休眠快速启动此系统上没有以下睡眠状态:待机 (S1)系统固件不支持此待机状态。待机 (S2)系统固件不支持此待机状态。待机 (S3)当支持 S0 低电量待机时,禁用此待机状态。混合睡眠待机 (S3) 不可用。虚拟机监控程序不支持此待机状态。
关键信息:
示例 2:台式机(支持传统睡眠)
此系统上有以下睡眠状态:待机 (S3)休眠混合睡眠快速启动此系统上没有以下睡眠状态:待机 (S1)系统固件不支持此待机状态。待机 (S2)系统固件不支持此待机状态。待机 (S0 低电量待机)系统固件不支持此待机状态。
关键信息:
方法二:查看当前电源计划设置
# 查看当前活动的电源计划powercfg /getactivescheme# 查看详细的电源设置powercfg /query
方法三:图形界面查看
控制面板 → 硬件和声音 → 电源选项 → 更改计划设置 → 更改高级电源设置
展开 “睡眠” 选项,查看可用的设置项。
台式机与笔记本的差异
对比表格
| 特性 | 台式机(典型配置) | 笔记本(现代配置) |
|---|---|---|
| 默认睡眠模式 | S3 传统睡眠 + 混合睡眠 | S0 现代待机 |
| 网络保持连接 | 断开 | 保持(Connected Standby) |
| 程序后台运行 | 完全暂停 | 部分程序可以运行 |
| 唤醒速度 | 中等(2-5秒) | 极快(<1秒) |
| 功耗 | 低 | 极低 |
| 硬件要求 | 低 | 高(需要特定芯片组支持) |
为什么笔记本可以保持部分功能运行?
现代笔记本的 S0 Modern Standby 采用了类似智能手机的电源管理策略:
网络栈保持活跃 :
应用白名单机制 :
智能唤醒 :
解决方案
方案一:系统设置方式
1. 禁用自动睡眠(简单直接)
通过设置应用:
设置 → 系统 → 电源 → 屏幕和睡眠 → 根据需要设置
通过控制面板:
控制面板 → 电源选项 → 编辑计划设置- "使计算机进入睡眠状态" → 从不- "更改高级电源设置"→ 睡眠 → 在此时间后睡眠 → 0(从不)→ 睡眠 → 在此时间后休眠 → 0(从不)
通过命令行:
2. 完全禁用休眠功能
# 以管理员身份运行powercfg /h off
效果:
删除 C:\hiberfil.sys 文件(释放磁盘空间) 电源选项中不再有休眠选项 无法进入休眠状态
恢复方法:
powercfg /h on
3. 禁用混合睡眠(仅台式机)
控制面板 → 电源选项 → 更改计划设置 → 更改高级电源设置 → 睡眠 → 允许混合睡眠 → 关闭
4. 使用高性能电源计划
# 列出所有电源计划powercfg /list# 切换到高性能计划powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
优点:
操作简单,无需编程 系统级别的设置,对所有程序有效
缺点:
24小时不休眠,耗电量大 需要手动更改系统设置 可能忘记在不使用时恢复省电模式
方案二:程序级防休眠(推荐)
通过调用 Windows API,让程序运行时 临时阻止系统休眠 ,程序退出后自动恢复正常电源管理。
核心 API:SetThreadExecutionState
EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
参数说明:
| 标志 | 值 | 说明 |
|---|---|---|
| ES_CONTINUOUS | 0x80000000 | 持续生效(直到清除或程序退出) |
| ES_SYSTEM_REQUIRED | 0x00000001 | 阻止系统自动睡眠 |
| ES_DISPLAY_REQUIRED | 0x00000002 | 阻止显示器自动关闭 |
| ES_AWAYMODE_REQUIRED | 0x00000040 | 启用离开模式(媒体播放器专用) |
组合使用:
// 阻止系统睡眠,允许显示器关闭ES_CONTINUOUS | ES_SYSTEM_REQUIRED// 阻止系统睡眠,同时保持显示器开启ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED// 恢复正常电源管理ES_CONTINUOUS
工作原理:
程序调用 API 设置执行状态标志 Windows 电源管理器检测到标志后不会自动进入睡眠 用户手动触发的睡眠操作(如按电源键)仍然有效 程序退出时系统自动清除标志 如果程序崩溃,系统也会自动清除(安全机制)
优点:
缺点:
代码实现
C# 版本
基础版本(支持显示器控制)
using System;using System.Runtime.InteropServices;namespace PowerManagement{/// 系统睡眠状态控制类 /// /// 功能说明: /// 通过调用 Windows Kernel32 API 控制系统电源管理行为,防止系统在程序运行期间自动进入睡眠或休眠状态。 /// 主要用于需要长时间持续运行的工业控制程序,避免因系统睡眠导致: /// /// - PLC 通信连接断开
/// - 设备控制序列中断
/// - 实时监控数据丢失
/// - 远程连接异常
///
/// 技术说明: /// - 使用 SetThreadExecutionState API 设置线程执行状态标志 /// - ES_CONTINUOUS 标志确保设置持续有效直到显式清除 /// - ES_SYSTEM_REQUIRED 标志阻止系统自动进入睡眠模式 /// - 程序异常退出时系统会自动清除标志,恢复正常电源管理 /// 应用场景: /// 适用于台式机的传统 S3 睡眠模式和笔记本的现代 S0 待机模式,但不阻止用户手动触发的睡眠操作。 /// public class SleepPreventer{/// 阻止系统睡眠的工作模式 public enum PreventMode{/// 仅阻止系统睡眠,允许显示器关闭 /// 适用场景:后台服务、无界面程序、允许显示器省电的情况 SystemOnly,/// 阻止系统睡眠且保持显示器开启 /// 适用场景:监控界面、远程桌面、需要持续显示的应用 SystemAndDisplay}/// 设置线程执行状态的 Windows API /// 执行状态标志的组合值/// 返回之前的线程执行状态标志。 /// 此 API 位于 kernel32.dll 中,用于通知系统当前线程正在执行关键操作,需要保持系统活动状态。 [DllImport("kernel32.dll")]static extern uint SetThreadExecutionState(uint esFlags);/// 执行状态持续标志 /// /// 值:0x80000000/// 表示执行状态设置持续有效,直到下一次调用 SetThreadExecutionState 清除或程序终止。 /// 必须与 ES_SYSTEM_REQUIRED 或 ES_DISPLAY_REQUIRED 组合使用。 /// const uint ES_CONTINUOUS = 0x80000000;/// 系统必需标志 /// /// 值:0x00000001/// 通知系统当前线程需要系统保持活动状态。 /// 防止系统自动进入睡眠模式,但允许显示器关闭。 /// const uint ES_SYSTEM_REQUIRED = 0x00000001;/// 显示器必需标志 /// /// 值:0x00000002/// 通知系统当前线程需要显示器保持开启状态。 /// 防止显示器自动关闭,同时也阻止系统进入睡眠模式。 /// 注意:未在当前实现中使用,如需保持显示器开启可在 方法中添加此标志。 /// const uint ES_DISPLAY_REQUIRED = 0x00000002;/// 阻止系统自动进入睡眠状态 /// 防休眠模式/// 操作是否成功 /// /// 执行流程: /// /// - 调用 SetThreadExecutionState API 设置执行状态标志
/// - 组合 ES_CONTINUOUS 和 ES_SYSTEM_REQUIRED 标志
/// - 持续阻止系统自动睡眠,直到调用
或程序终止 ///
/// 注意事项: /// - 仅阻止系统自动睡眠,不影响用户手动触发的睡眠操作 /// - 显示器仍可能自动关闭(如需保持显示器开启,需添加 ES_DISPLAY_REQUIRED 标志) /// - 建议在程序主入口点或服务启动时调用 /// - 程序崩溃或异常退出时,系统会自动清除此设置 /// 应用建议: /// 适用于需要长时间连续运行的场景,如 PLC 通信监控、设备控制序列执行、数据采集等。 /// /// /// 在程序启动时调用:/// /// public static void Main()/// {///SleepPreventer.PreventSleep();///// ... 程序主逻辑/// }/// /// public static bool PreventSleep(PreventMode mode = PreventMode.SystemOnly){uint flags = ES_CONTINUOUS | ES_SYSTEM_REQUIRED;if (mode == PreventMode.SystemAndDisplay){flags |= ES_DISPLAY_REQUIRED;}uint result = SetThreadExecutionState(flags);return result != 0;}/// 恢复系统正常电源管理行为 /// /// 执行流程: /// /// - 调用 SetThreadExecutionState API 并仅传入 ES_CONTINUOUS 标志
/// - 清除之前设置的 ES_SYSTEM_REQUIRED 标志
/// - 系统恢复正常的自动睡眠行为
///
/// 注意事项: /// - 建议在程序正常退出前调用,确保不影响系统的电源管理 /// - 如果程序异常终止未调用此方法,系统会自动清除执行状态设置 /// - 调用后系统将按照电源计划设置的时间自动进入睡眠 /// 应用建议: /// 在程序关闭事件、服务停止事件或 Dispose 方法中调用此方法。 /// /// /// 在程序退出时调用:/// /// protected override void OnClosed(EventArgs e)/// {///SleepPreventer.AllowSleep();///base.OnClosed(e);/// }/// /// public static void AllowSleep(){SetThreadExecutionState(ES_CONTINUOUS);}}}
使用示例
WinForms 应用程序:
public partial class MainForm : Form{public MainForm(){InitializeComponent();// 窗口加载时阻止休眠this.Load += (s, e) => SleepPreventer.PreventSleep();// 窗口关闭时恢复this.FormClosing += (s, e) => SleepPreventer.AllowSleep();}}
WPF 应用程序:
public partial class App : Application{protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);// 程序启动时阻止休眠SleepPreventer.PreventSleep();}protected override void OnExit(ExitEventArgs e){// 程序退出时恢复SleepPreventer.AllowSleep();base.OnExit(e);}}
控制台应用程序:
class Program{static void Main(string[] args){// 阻止休眠SleepPreventer.PreventSleep();Console.WriteLine("程序运行中,系统不会自动睡眠...");Console.WriteLine("按任意键退出");// 业务逻辑DoWork();Console.ReadKey();// 恢复正常SleepPreventer.AllowSleep();}static void DoWork(){// 长时间运行的任务while (true){// PLC 通信、数据采集等Thread.Sleep(1000);}}}
Windows 服务:
public partial class MyService : ServiceBase{protected override void OnStart(string[] args){// 服务启动时阻止休眠SleepPreventer.PreventSleep();// 启动业务逻辑StartWorkThread();}protected override void OnStop(){// 服务停止时恢复SleepPreventer.AllowSleep();// 停止业务逻辑StopWorkThread();}}
C++ 版本
基础版本
// SleepPreventer.h#ifndef SLEEP_PREVENTER_H#define SLEEP_PREVENTER_H#include/** * @brief 系统睡眠状态控制类 ** 通过调用 Windows API 控制系统电源管理行为,防止系统在程序运行期间 * 自动进入睡眠或休眠状态。 ** 主要用于需要长时间持续运行的工业控制程序,避免因系统睡眠导致: * - PLC 通信连接断开 * - 设备控制序列中断 * - 实时监控数据丢失 * - 远程连接异常 ** @note 适用于 Windows XP SP1 及以上版本 */class SleepPreventer{public:/*** @brief 阻止系统自动进入睡眠状态** 执行流程:* 1. 调用 SetThreadExecutionState API 设置执行状态标志* 2. 组合 ES_CONTINUOUS 和 ES_SYSTEM_REQUIRED 标志* 3. 持续阻止系统自动睡眠,直到调用 AllowSleep() 或程序终止** @note 仅阻止系统自动睡眠,不影响用户手动触发的睡眠操作* @note 显示器仍可能自动关闭(如需保持显示器开启,调用 PreventSleepAndDisplay())* @note 程序崩溃或异常退出时,系统会自动清除此设置** @return 成功返回 true,失败返回 false** @example* @code* int main()* {*SleepPreventer::PreventSleep();**// 你的业务逻辑*DoWork();**SleepPreventer::AllowSleep();*return 0;* }* @endcode*/static bool PreventSleep();/*** @brief 阻止系统睡眠并保持显示器开启** 相比 PreventSleep(),此方法同时保持显示器开启状态。* 适用于需要持续显示界面的应用程序(如监控系统、远程桌面等)。** @return 成功返回 true,失败返回 false** @example* @code* // 用于监控界面,保持屏幕常亮* SleepPreventer::PreventSleepAndDisplay();* @endcode*/static bool PreventSleepAndDisplay();/*** @brief 恢复系统正常电源管理行为** 执行流程:* 1. 调用 SetThreadExecutionState API 并仅传入 ES_CONTINUOUS 标志* 2. 清除之前设置的 ES_SYSTEM_REQUIRED 标志* 3. 系统恢复正常的自动睡眠行为** @note 建议在程序正常退出前调用,确保不影响系统的电源管理* @note 如果程序异常终止未调用此方法,系统会自动清除执行状态设置** @return 成功返回 true,失败返回 false*/static bool AllowSleep();private:/// 执行状态持续标志(0x80000000)static const DWORD ES_CONTINUOUS = 0x80000000;/// 系统必需标志(0x00000001)- 阻止系统睡眠static const DWORD ES_SYSTEM_REQUIRED = 0x00000001;/// 显示器必需标志(0x00000002)- 保持显示器开启static const DWORD ES_DISPLAY_REQUIRED = 0x00000002;};#endif // SLEEP_PREVENTER_H
// SleepPreventer.cpp#include "SleepPreventer.h"bool SleepPreventer::PreventSleep(){EXECUTION_STATE result = SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);// SetThreadExecutionState 返回之前的状态,返回 0 表示失败return (result != 0);}bool SleepPreventer::PreventSleepAndDisplay(){EXECUTION_STATE result = SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);return (result != 0);}bool SleepPreventer::AllowSleep(){EXECUTION_STATE result = SetThreadExecutionState(ES_CONTINUOUS);return (result != 0);}
面向对象版本(RAII 自动管理)
// SleepPreventerRAII.h#ifndef SLEEP_PREVENTER_RAII_H#define SLEEP_PREVENTER_RAII_H#include/** * @brief RAII 风格的睡眠防护类 ** 使用 RAII(Resource Acquisition Is Initialization)模式自动管理 * 睡眠防护的生命周期: * - 构造函数:自动阻止系统睡眠 * - 析构函数:自动恢复正常电源管理 ** 这种方式确保即使发生异常,也能正确恢复系统电源设置。 ** @example * @code * void DoLongRunningTask() * { *// 创建对象时自动阻止睡眠 *SleepPreventerRAII preventer; **// 执行长时间任务 *ProcessData(); *CommunicateWithPLC(); **// 函数返回时自动析构,恢复电源管理 * } * @endcode */class SleepPreventerRAII{public:/*** @brief 防休眠模式枚举*/enum class Mode{SystemOnly,///< 仅阻止系统睡眠,允许显示器关闭SystemAndDisplay///< 阻止系统睡眠且保持显示器开启};/*** @brief 构造函数 - 自动阻止系统睡眠** @param mode 防休眠模式*/explicit SleepPreventerRAII(Mode mode = Mode::SystemOnly);/*** @brief 析构函数 - 自动恢复正常电源管理*/~SleepPreventerRAII();// 禁止拷贝和赋值SleepPreventerRAII(const SleepPreventerRAII&) = delete;SleepPreventerRAII& operator=(const SleepPreventerRAII&) = delete;/*** @brief 检查是否成功设置防休眠** @return 成功返回 true,失败返回 false*/bool IsActive() const { return m_isActive; }private:bool m_isActive;///< 是否已成功激活防休眠EXECUTION_STATE m_previousState;///< 保存之前的执行状态static const DWORD ES_CONTINUOUS = 0x80000000;static const DWORD ES_SYSTEM_REQUIRED = 0x00000001;static const DWORD ES_DISPLAY_REQUIRED = 0x00000002;};#endif // SLEEP_PREVENTER_RAII_H
// SleepPreventerRAII.cpp#include "SleepPreventerRAII.h"SleepPreventerRAII::SleepPreventerRAII(Mode mode): m_isActive(false), m_previousState(0){DWORD flags = ES_CONTINUOUS | ES_SYSTEM_REQUIRED;if (mode == Mode::SystemAndDisplay){flags |= ES_DISPLAY_REQUIRED;}m_previousState = SetThreadExecutionState(flags);m_isActive = (m_previousState != 0);}SleepPreventerRAII::~SleepPreventerRAII(){if (m_isActive){// 恢复正常电源管理SetThreadExecutionState(ES_CONTINUOUS);}}
使用示例
控制台应用程序:
#include#include #include #include "SleepPreventer.h"int main(){std::cout << "程序启动,阻止系统睡眠..." << std::endl;// 阻止系统睡眠if (!SleepPreventer::PreventSleep()){std::cerr << "警告:无法阻止系统睡眠!" << std::endl;}// 模拟长时间运行的任务for (int i = 0; i < 60; ++i){std::cout << "运行中... " << i << " 秒" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));}// 恢复正常电源管理SleepPreventer::AllowSleep();std::cout << "任务完成,恢复正常电源管理" << std::endl;return 0;}
使用 RAII 版本:
#include#include "SleepPreventerRAII.h"void ProcessData(){// 使用 RAII,自动管理生命周期SleepPreventerRAII preventer(SleepPreventerRAII::Mode::SystemOnly);if (!preventer.IsActive()){std::cerr << "警告:无法阻止系统睡眠!" << std::endl;}std::cout << "开始数据处理..." << std::endl;// 执行长时间任务// ... 你的业务逻辑 ...std::cout << "数据处理完成" << std::endl;// 函数返回时自动恢复电源管理(析构函数调用)}int main(){ProcessData();return 0;}
Qt 应用程序:
// MainWindow.h#include#include "SleepPreventer.h"class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();protected:void showEvent(QShowEvent *event) override;void closeEvent(QCloseEvent *event) override;private:bool m_sleepPrevented;};
// MainWindow.cpp#include "MainWindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), m_sleepPrevented(false){}MainWindow::~MainWindow(){if (m_sleepPrevented){SleepPreventer::AllowSleep();}}void MainWindow::showEvent(QShowEvent *event){QMainWindow::showEvent(event);// 窗口显示时阻止睡眠if (SleepPreventer::PreventSleepAndDisplay()){m_sleepPrevented = true;qDebug() << "已阻止系统睡眠";}}void MainWindow::closeEvent(QCloseEvent *event){// 窗口关闭时恢复if (m_sleepPrevented){SleepPreventer::AllowSleep();m_sleepPrevented = false;qDebug() << "已恢复正常电源管理";}QMainWindow::closeEvent(event);}
MFC 应用程序:
// MainDlg.cpp#include "SleepPreventer.h"BOOL CMainDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 对话框初始化时阻止睡眠if (SleepPreventer::PreventSleep()){TRACE(_T("已阻止系统睡眠\n"));}else{AfxMessageBox(_T("警告:无法阻止系统睡眠!"));}return TRUE;}void CMainDlg::OnDestroy(){// 对话框销毁时恢复SleepPreventer::AllowSleep();TRACE(_T("已恢复正常电源管理\n"));CDialogEx::OnDestroy();}
常见问题解答
Q1: 为什么笔记本合盖后程序还能运行,但台式机睡眠后就不行?
因为两者使用的睡眠技术不同:
笔记本(S0 Modern Standby) :
台式机(S3 传统睡眠) :
解决方案:
Q2: SetThreadExecutionState 会影响用户手动睡眠操作吗?
不会 。此 API 只阻止系统 自动 进入睡眠,不影响用户主动操作:
这是 Windows 设计的安全机制,确保用户始终有最高控制权。
Q3: 程序崩溃或被强制结束,系统会一直不睡眠吗?
不会 。Windows 有安全机制:
建议:
主动调用 AllowSleep() 这是良好的编程习惯,体现对系统资源的尊重
Q4: 为什么有时候设置了还是会睡眠?
可能的原因:
API 调用失败
// 检查返回值uint result = SetThreadExecutionState(...);if (result == 0){// 失败,获取错误码int error = Marshal.GetLastWin32Error();}
标志设置不正确
被其他程序或策略覆盖
电源按钮被按下
调试方法:
# 查看哪些程序正在阻止睡眠powercfg /requests
输出示例:
DISPLAY:[PROCESS] \Device\HarddiskVolume3\Program Files\MyApp\MyApp.exeSYSTEM:[PROCESS] \Device\HarddiskVolume3\Program Files\MyApp\MyApp.exe
Q5: 是否需要管理员权限?
不需要 。SetThreadExecutionState 是用户级 API:
但是 修改系统电源设置 需要管理员权限:
# 需要管理员权限powercfg /h offpowercfg /change standby-timeout-ac 0
Q6: 对笔记本电池有影响吗?
有一定影响,取决于使用方式:
| 场景 | 影响 | 建议 |
|---|---|---|
| 接通电源 | 无影响 | 正常使用 |
| 使用电池 | 电池消耗加快 | 谨慎使用,建议接通电源 |
| 仅阻止系统睡眠 | 影响较小 | 可接受 |
| 同时保持显示器开启 | 影响较大 | 尽量避免 |
节能建议:
// 检测电源状态if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online){// 接通电源,阻止睡眠SleepPreventer.PreventSleep();}else{// 使用电池,允许睡眠以节能SleepPreventer.AllowSleep();}
Q7: 支持哪些 Windows 版本?
SetThreadExecutionState API 支持:
兼容性非常好 ,几乎所有现代 Windows 系统都支持。
Q8: 如何在多线程环境中使用?
SetThreadExecutionState 是线程局部的,但标志是全局共享的:
// 错误示例:多个线程同时设置可能冲突Thread thread1 = new Thread(() => {SleepPreventer.PreventSleep();DoWork1();SleepPreventer.AllowSleep(); // ⚠️ 会影响其他线程});Thread thread2 = new Thread(() => {SleepPreventer.PreventSleep();DoWork2();// thread1 调用 AllowSleep 后,这里的设置会被清除});
推荐方案:
// 在主线程统一管理public class PowerManager{private static int _preventCount = 0;private static readonly object _lock = new object();public static void PreventSleep(){lock (_lock){if (_preventCount == 0){SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);}_preventCount++;}}public static void AllowSleep(){lock (_lock){_preventCount--;if (_preventCount <= 0){_preventCount = 0;SetThreadExecutionState(ES_CONTINUOUS);}}}}
Q9: 与其他电源管理工具冲突吗?
一般不会,但有特殊情况:
兼容的工具:
可能冲突的情况:
检查方法:
# 查看活动的电源请求powercfg /requests# 查看组策略设置gpedit.msc → 计算机配置 → 管理模板 → 系统 → 电源管理
Q10: 远程桌面断开后,程序会睡眠吗?
取决于系统配置:
Windows 10/11 默认行为:
如果需要保持远程可用:
// 保持显示器开启,确保远程桌面可用SleepPreventer.PreventSleep(SleepPreventer.PreventMode.SystemAndDisplay);
组策略设置:
gpedit.msc → 计算机配置 → 管理模板 → Windows 组件 → 远程桌面服务→ 远程桌面会话主机 → 连接 → "允许用户通过使用远程桌面服务远程连接" → 已启用
总结
关键要点
理解不同的睡眠模式
选择合适的解决方案
程序级防休眠优势
最佳实践
代码使用建议
| 应用类型 | 推荐模式 | 说明 |
|---|---|---|
| 后台服务 | SystemOnly | 允许显示器关闭以节能 |
| 监控界面 | SystemAndDisplay | 保持屏幕显示 |
| 数据采集 | SystemOnly | 无界面程序 |
| 远程控制 | SystemAndDisplay | 确保远程可用 |
| 工业控制 | SystemOnly | 保持 PLC 通信 |
以上就是Windows系统进入了休眠或睡眠状态怎么办?如何解决的详细内容,更多相关资料请阅读主机测评网其它文章!














发表评论