在我的文件传输应用程序(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?
发布于 2022-06-06 09:47:45
看来SetThreadExecutionState(ES_SYSTEM_REQUIRED)
“重置空闲计时器”API (即没有ES_CONTINUOUS
标志)在Windows11中被破坏了。
ES_CONTINUOUS
API可以工作。所以我不得不重新设计我的应用程序来使用那个。由于我的应用程序可以有多个线程,每次执行冗长的操作,在操作期间从每个线程重复调用SetThreadExecutionState(ES_SYSTEM_REQUIRED)
更为方便。
现在,我必须有一个单独的线程,它的唯一目的是向系统报告应用程序状态。第一次由任何线程调用SetThreadExecutionState(ES_SYSTEM_REQUIRED)
时,现在触发调用SetThreadExecutionState(ES_SYSTEM_REQUIRED | ES_CONTINUOUS)
的“状态线程”。进一步的调用只是重置一个内部5秒计时器。如果定时器最终过期,状态线程将调用SetThreadExecutionState(ES_CONTINUOUS)
。
https://stackoverflow.com/questions/72436579
复制相似问题