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

标签 c++ windows winapi screensaver

在 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"

但是由于有两种相互竞争的方法似乎在做同样的事情,推荐的使用方法是什么?

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

一个。如果您阅读了 SPI_GETSCREENSAVEACTIVE flag 中的错误说明, 你会看到 MS 本身 recommend使用注册表。

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

最佳答案

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


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

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

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

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


您要达到什么目的?为什么需要修改屏保事件?也许有一些更好的方法来实现你的目标

关于c++ - 要在 Windows 上读取/设置用户屏幕保护程序,我是否需要使用系统注册表或 SystemParametersInfo API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12137105/

相关文章:

c++ - 在构造函数初始化列表中初始化成员数组(C++11 之前)

c++ - 将 std::list 扩展为循环列表

windows - 如何检测连接的 USB 打印机是打开还是关闭?

c++ - 如何在 Windows 上切换到另一个应用程序(使用 C++、Qt)?

c++ - 为 Windows 7 开发设置为 32 位

java - 如何在java中使用SetWindowsHookEx函数?

c++ - 自动返回值推断和 C++ 静态类型

c++ - Linux - 动态和静态加载时调用相同的函数

windows - 我可以创建一个设备上下文,它只是另一个设备上下文的一部分吗?

带有等待窗口的 C++ 线程终止