【发布时间】:2022-06-30 12:53:29
【问题描述】:
在我的文件传输应用程序 (WinSCP) 中,我使用 SetThreadExecutionState(ES_SYSTEM_REQUIRED) 来防止系统在文件传输过程中进入睡眠模式。但这在 Windows 11 上不再适用。
我没有找到任何关于应用程序在 Windows 11 上阻止睡眠模式的不同要求的参考。
我的应用程序是 C++ Win32 应用程序。但我可以用一个简单的 .NET 5 WinForms C# 应用程序重现同样的问题。
private System.Windows.Forms.Timer timer1;
private System.Windows.Forms.Label label1;
public enum EXECUTION_STATE : uint
{
ES_SYSTEM_REQUIRED = 0x00000001
}
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern uint SetThreadExecutionState(EXECUTION_STATE esFlags);
// The timer ticks every second.
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = (int.Parse(label1.Text) + 1).ToString();
SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED);
}
只要应用程序在 Windows 10 上运行,系统就永远不会进入睡眠模式。但 Windows 11 会按计划进入睡眠状态。
Windows 11 上的 Windows 文件资源管理器在传输文件时成功防止睡眠。因此,阻止 Windows 11 进入睡眠模式并非不可能。
为什么SetThreadExecutionState(ES_SYSTEM_REQUIRED) 在 Windows 11 上不再工作? Windows 11 上是否有用于此任务的不同 API?
【问题讨论】:
-
@HansPassant 我以前看过那个帖子。但我相信这主要是关于硬件和完全相反的问题(计算机不会进入或从睡眠中醒来)。还是我错过了线程的某些特定相关部分?
-
好吧,我可以告诉你,我的 8.1 平板电脑连接待机忽略了大多数本应保持正常运行的电源 API,并在超时后进入睡眠状态。
-
在这个例子中你的计时器多久计时一次?
-
@MartinPrikryl 你试过添加
ES_CONTINUOUS标志吗?
标签: .net windows winapi kernel32 sleep-mode