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