如何使用user32.dll为当前用户(或)通过C#代码在Windows中的任何其他用户更改屏幕保护程序超时和screensaverissecure,因为我的应用程序在后台进程中以SYSTEM权限运行。
当我们使用c#或脚本编写HKEY_CURRENT_USER \ Control Panel \ Desktop \ ScreensaverTimeout来更改此注册表的值时 和HKEY_CURRENT_USER \ Control Panel \ Desktop \ ScreenSaverIsSecure 只有在重新启动机器后才会显示此效果。
当我们使用具有SYSTEM权限的c#代码更改注册表值时,这些更改不会影响新值。
答案 0 :(得分:2)
Q1:...此效果仅在重启机器后显示:
更新注册表后,您可以调用UpdatePerUserSystemParameters强制Windows从注册表重新读取配置(以便更新立即生效)。
rundll32.exe user32.dll, UpdatePerUserSystemParameters
Q2:...使用SYSTEM权限时,这些更改不会影响新值:
您需要启动一个与当前登录用户在同一会话中运行的新进程,并更新新进程的注册表值。 This是开始时的好问题。
答案 1 :(得分:1)
更改此类窗口设置后,需要使用WM_SETTINGCHANGE消息向所有窗口调用WinApi SendNotifyMessage。这就是为什么在重启之前不会更新您的设置的原因。 (我认为您会发现注销会为该用户实现相同的目标)。
WINAPI https://msdn.microsoft.com/en-us/library/windows/desktop/ms725497%28v=vs.85%29.aspx
C#wrapper over send message http://www.pinvoke.net/default.aspx/user32.sendnotifymessage