首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SetThreadExecutionState(ES_SYSTEM_REQUIRED)不能阻止Windows 11上的系统休眠

SetThreadExecutionState(ES_SYSTEM_REQUIRED)不能阻止Windows 11上的系统休眠
EN

Stack Overflow用户
提问于 2022-05-30 15:17:25
回答 2查看 364关注 0票数 3

在我的文件传输应用程序(WinSCP)中,我使用SetThreadExecutionState(ES_SYSTEM_REQUIRED)来防止系统在文件传输过程中进入休眠模式。但是这在Windows 11上不再起作用了。

我没有找到任何关于应用程序防止Windows 11睡眠模式的不同要求的参考。

我的应用程序是C++ Win32应用程序。但是,我可以在一个简单的.NET 5 WinForms C#应用程序中重现同样的问题。

代码语言:javascript
运行
复制
private System.Windows.Forms.Timer timer1;
private System.Windows.Forms.Label label1;
代码语言:javascript
运行
复制
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?

EN

Stack Overflow用户

回答已采纳

发布于 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)

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72436579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档