通过Win32 API修改设置后Windows屏幕保护超时不生效问题
远程控制屏保的超时设置无法立即生效问题
问题概述
我为客户开发了一款可远程控制的.scr格式屏幕保护程序,支持以下功能:
- 切换媒体类型(视频、图片)
- 启停屏幕保护
- 设置超时时间
目前除超时设置外,所有功能均正常运行。超时设置存在的问题是:修改后无法立即生效,仅在以下两种场景下才会生效:
- 重启机器后
- 切换至系统自带的
3D Text屏保,再切回自研屏保时偶尔生效
安装方式说明
针对屏保安装,我测试了两种方案,最终选用了更简便的注册表方式:
- 注册表手动配置
- 调用
user32.dll中的InstallScreensaver工具
已尝试的超时修复方案
为解决超时无法立即生效的问题,我尝试了以下所有方案,但均未成功:
- 直接修改注册表中
ScreenSaveTimeout值,随后调用带SPIF_SENDCHANGE参数的SystemParametersInfo - 调用
SystemParametersInfo并传入SPI_SETSCREENSAVETIMEOUT,搭配SPIF_SENDCHANGE、SPIF_UPDATEINIFILE、SPIF_SENDWININICHANGE的所有参数组合 - 手动/在安装程序中执行命令强制更新参数:
rundll32.EXE user32.dll,UpdatePerUserSystemParameters - 将自研屏保文件的所有者改为
SYSTEM账户
以上操作均能成功更新注册表和系统屏幕保护设置界面中的超时数值,但修改后的规则始终无法立即触发。
项目环境
- 开发语言/框架:C# .NET Core 3.1
- 外部依赖:仅LibVLC等两个第三方库,资源与内存消耗极低
请问我遗漏了什么关键步骤或配置?
内容的提问来源于stack exchange,提问作者Zlatan Omerović
相关产品推荐
相关产品推荐

