1

在 Windows 平台上设置和获取用户屏保参数似乎有两种方法:

1:通过 SystemParametersInfo() API:

//To read
SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bScreensaverAcrtive, NULL);
SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, &nScreensaverTimeout, NULL);
//No API to get the screensaver file used

//To set
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, bScreensaverAcrtive, NULL);
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, 0, nScreensaverTimeout, NULL);
//No API to change the screensaver file

2:通过系统注册表项:

HKCU\Control Panel\Desktop - "ScreenSaveActive"
HKCU\Control Panel\Desktop - "ScreenSaveTimeOut"
HKCU\Control Panel\Desktop - "SCRNSAVE.EXE"

但既然有两种竞争方法似乎做同样的事情,那么推荐的使用方法是什么?

PS。由于以下原因,我非常喜欢方法#2(或直接写入注册表):

A. 如果您阅读SPI_GETSCREENSAVEACTIVE 标志中的错误说明,您会看到 MS 自己建议使用注册表。

B. 如果您阅读SPI_SETSCREENSAVEACTIVESPI_SETSCREENSAVETIMEOUT标志的文档,有一条神秘的线说:“*如果机器进入省电模式或系统锁定状态,则会发生 ERROR_OPERATION_IN_PROGRESS 异常。*”我首先忽略了这种情况,直到它实际上开始发生在我的 Windows 8 测试安装中。这是最愚蠢的错误,我应该告诉你。绝对没有优雅的方式来解释它的含义或做任何解决方法(除非直接写入注册表。)

4

3 回答 3

3

使用 API。问这就像问你是否应该在过马路之前等待红绿灯变绿。如果我看到你在红色路口过马路,我不会报警,但如果你问我,我会告诉你必须等待。而是冒着坏事发生风险的人。


API 有文档记录,注册表位置没有。Microsoft 没有义务保留注册表位置或其功能。

SPI_GETSCREENSAVEACTIVE 标志会影响 Windows 2000。如果您支持 Windows 2000 作为目标平台,我将仅将注册表读取应用到该版本 ( OSVERSIONINFO.dwMajor=5, .dwMinor=0)

ERROR_OPERATION_IN_PROGRESS我想弄清楚在什么情况下会发生这种情况(例如屏幕保护程序已经激活,或者系统即将进入省电状态)。

一般来说,如果激活/停用屏幕保护程序至少与用户操作无关,我会发现这是有问题的,在这种情况下,系统应该准备好接受更改。


你想达到什么目的?为什么需要修改屏保活动?也许有更好的方法来实现你的目标

于 2012-08-27T08:03:49.123 回答
1

使用 API。注册表格式经常更改。

至于电源状态的变化,屏幕保护程序确实是 20 世纪的功能。出于显而易见的原因,笔记本电脑会完全关闭屏幕。在那种省电状态下SPI_SETSCREENSAVEACTIVE显然应该失败。没有太多的口译工作要做。

所以,先检查一下GUID_VIDEO_POWERDOWN_TIMEOUT

编辑

我刚刚意识到组策略屏幕保护程序也不太可能在注册表中,并且肯定会覆盖HKCU. 当然,对于 Windows 2000 来说这不是一个真正的问题,但今天 API 方法将更加可取。当然,要意识到这只是SPI_SETSCREENSAVEACTIVE可能返回错误的另一个原因。仍然是对注册表方法的改进,在存在组策略的情况下会默默地失败。

于 2012-08-27T07:59:00.767 回答
0

上面的“设置”是不正确的。它应该是:

//To set
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, bScreensaverAcrtive, NULL, NULL);
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, nScreensaverTimeout, NULL, NULL);
于 2013-04-09T01:28:26.843 回答