SystemParametersInfo和ERROR_OPERATION_IN_PROGRESS

时间:2012-08-13 06:09:10

标签: c++ winapi windows-8 screensaver usermode

我正在编写此用户模式可执行文件,可以在登录用户的上下文中从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上。

2 个答案:

答案 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+计算机似乎无法唤醒屏幕。