要在Windows上读取/设置用户屏幕保护程序,是否需要使用系统注册表或SystemParametersInfo API



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

1:通过系统参数Info()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:通过系统注册表项:

HKCUControl PanelDesktop - "ScreenSaveActive"
HKCUControl PanelDesktop - "ScreenSaveTimeOut"
HKCUControl PanelDesktop - "SCRNSAVE.EXE"

但是,既然有两种相互竞争的方法看起来是一样的,那么建议使用什么方法呢?

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

A。如果您阅读了SPI_GETSCREENSAVACTIVE标志中错误的解释,您将看到MS自己建议使用注册表。

B。如果您阅读SPI_SETSCREENSAVEACTIVE和SPI_SETSCRENSAVETIMEOUT标志的文档,会发现一条神秘的线,上面写着:"*如果机器已进入节能模式或系统锁定状态,则会发生ERROR_OPERATION_IN_PROGRESS异常。*"我最初忽略了这种情况,直到它在Windows 8的测试安装中真正开始发生。我应该告诉你,这是最愚蠢的错误。绝对没有一种优雅的方式来解释它的含义或做任何变通方法(除了直接写入注册表之外)

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


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

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

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

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


你想实现什么为什么需要修改屏幕保护程序活动?也许有一些更好的方法来实现你的目标

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

至于电力状态的变化,屏幕保护程序实际上是20世纪的一个特色。笔记本电脑完全关闭屏幕,原因很明显。在该省电状态下,CCD_ 4显然应该失效。没有太多的口译工作要做。

因此,请先检查GUID_VIDEO_POWERDOWN_TIMEOUT

编辑

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

上面的"To set"不正确。应该是:

//To set
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, bScreensaverAcrtive, NULL, NULL);
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, nScreensaverTimeout, NULL, NULL);

相关内容

  • 没有找到相关文章

最新更新