我正在编写此用户模式可执行文件,可以在登录用户的上下文中从Windows平台上的本地服务运行。其主要目的是配置所有登录用户的桌面。它调用以下API来设置屏幕保护程序:
if(!SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, nTimeoutSec, 0, 0))
{
//Error
GetLastError();
}
if(!SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, nActive, 0, 0))
{
//Error
GetLastError();
}
上面的代码在大多数情况下都有效,除非我有多个用户登录到Windows控制台时我得到了这个奇怪的错误ERROR_OPERATION_IN_PROGRESS。我查了documentation,它有这样的解释:
如果机器已进入省电模式或系统锁定状态,则为 发生ERROR_OPERATION_IN_PROGRESS异常。
好的,但我该如何处理这个错误?
PS。这种情况最常发生在Windows 8上。
答案 0 :(得分:0)
SPI_SETSCREENSAVEACTIVE
会产生一些错误,什么都不做。尝试向SC_SCREENSAVE
窗口发送WM_SYSCOMMAND
GetDesktopWindow()
条消息。
答案 1 :(得分:0)
好吧,看起来这对Windows 8+来说实际上是不可能的,尽管它没有在MSDN上明确说明。
它在SetThreadExecutionState的另一篇MSDN文章中说明,在Windows 8上 ES_DISPLAY_REQUIRED 标志不会唤醒屏幕。
Windows 8:此标记只能打开显示屏,不能打开当前关闭的显示屏。
有一个用于删除活动屏幕保护程序的API调用(SPI_SETSCREENSAVEACTIVE)确实说明了以下内容:
如果机器已进入省电模式或系统锁定状态,则会发生ERROR_OPERATION_IN_PROGRESS异常
系统未处于锁定状态且未处于省电模式(使用GUID_MIN_POWER_SAVINGS),因此Windows 8+计算机似乎无法唤醒屏幕。