如何在我的C++应用程序运行时防止Windows进入睡眠状态?

13

我使用Qt和Visual Studio 2015开发了一个C++应用程序。

我想知道如何在我的应用程序运行时防止计算机进入睡眠状态。我的应用程序应该始终在后台运行,并通过语音响应用户的命令。

是否有方法可以在我的应用程序运行时防止Windows进入睡眠状态?


1
在提问之前,我已经看过了。但是我没有找到我想要的答案。 - ProEns08
1
它在哪方面没有回答你的问题? - Martin Bonner supports Monica
我不知道在我的代码中应该把函数SetThreadExecutionState的调用放在哪里。是在main()函数的开头还是在无限处理循环中? - ProEns08
@ProEns08:可以在主函数中(使其持续整个应用程序),或在消息处理程序中(当您想要开始防止睡眠时)设置。 - Martin Bonner supports Monica
@ProEns08:请忽略我。请看下面Alex Halls的评论。 - Martin Bonner supports Monica
这听起来像是一个糟糕的设计。如果用户离开,计算机应该进入睡眠状态。整个睡眠功能非常成功地节省了电力; 您的程序将会撤销所有这些节能。 - MSalters
2个回答

20

SetThreadExecutionState函数

使应用程序通知系统其正在使用,从而在应用程序运行时防止系统进入睡眠或关闭显示器。

在此处阅读有关API的更多信息:SetThreadExecutionState

示例:

// The following sets the appropriate flags to prevent system to go into sleep mode.
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);

// This clears the flags and allows the system to sleep normally.
SetThreadExecutionState(ES_CONTINUOUS);

我不知道在我的代码中应该在main()函数还是无限处理循环中调用这个函数? - ProEns08
2
你的程序中任何需要重复调用函数的地方,时间间隔应该小于Windows进入睡眠状态的时间间隔。你也可以编写一个函数,它只被调用一次,然后进入一个无限循环,每次循环都会调用SetThreadExecutionState函数,等待45秒,再重新开始循环(并再次调用SetThread~函数),直到应用程序退出。 - Alex Hall
@AlexHall:感谢您的信息,这正是我想要的。 - ProEns08
@ProEns08,我已经添加了一个示例,请查看。 - ddacot
在我的看来,NameTooLongException的答案详细说明了一个预先存在的函数,你可以在main()函数开始时调用该函数,按照他引用的代码中所写的精确地调用该函数即可。 - Alex Hall
显示剩余2条评论

9
根据Martin Bonner和ddacot建议的API文档SetThreadExecutionState,解释得相当清楚。
根据您的描述,您应该将以下函数放在main()中。
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);

根据文件,
  • ES_CONTINUOUS指示系统设置的状态应保持有效,直到下一次使用ES_CONTINUOUS和其他状态标志之一的调用被清除。

  • ES_SYSTEM_REQUIRED通过重置系统空闲计时器强制使系统处于工作状态。

  • ES_AWAYMODE_REQUIRED强制媒体应用程序在后台运行,以便您可以通过语音调用您的应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接