1

我正在编写这个用户模式可执行文件,它可以在登录用户的上下文中从 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。我查阅了文档,它有这样的解释:

如果机器已进入省电模式或系统锁定状态,则会发生 ERROR_OPERATION_IN_PROGRESS 异常。

好的,但是我该如何处理这个错误呢?

PS。这在 Windows 8 上最常发生。

4

2 回答 2

0

SPI_SETSCREENSAVEACTIVE可能会产生一些错误并且什么也不做。尝试向窗口发送一条WM_SYSCOMMAND带有SC_SCREENSAVE消息。GetDesktopWindow()

于 2012-08-13T07:02:08.663 回答
0

好的,看起来这在 Windows 8+ 上实际上是不可能的,尽管它没有在 MSDN 上明确说明。

我的研究

它确实在SetThreadExecutionState的另一篇 MSDN 文章中指出,在 Windows 8 上,ES_DISPLAY_REQUIRED标志不会唤醒屏幕。

Windows 8:此标志只能使显示器保持打开状态,不能打开当前关闭的显示器。

有一个用于删除活动屏幕保护程序 ( SPI_SETSCREENSAVEACTIVE ) 的 API 调用确实说明了以下内容:

如果机器已进入省电模式或系统锁定状态,则会发生 ERROR_OPERATION_IN_PROGRESS 异常

结论

系统未处于锁定状态且未处于省电模式(使用GUID_MIN_POWER_SAVINGS),因此 Windows 8+ 机器似乎无法唤醒屏幕。

于 2016-05-12T21:55:00.447 回答