如何刷新登录屏幕保护程序参数更改?

时间:2014-01-13 06:32:13

标签: c++ winapi windows-services screensaver windows-screensaver

我有一个Windows服务可能会更改Windows中登录屏幕保护程序的超时(如described here。)为此,我将以下注册表项更改为超时(以秒为单位):

HKEY_USERS\.DEFAULT\Control Panel\Desktop\ScreenSaveTimeOut

问题是如何在上面的注册表项更改后让操作系统“读取”或刷新实际的屏幕保护程序超时?

我的练习表明只有在我重新启动系统时才会刷新(当然),但在我的情况下,我需要在没有重启的情况下应用它。

EDIT_1:根据以下建议,我尝试了以下标志的所有可能组合:

DWORD bsmInfo1 = BSM_ALLDESKTOPS;
DWORD dwFlgs = BSF_FORCEIFHUNG | BSF_IGNORECURRENTTASK | BSF_NOTIMEOUTIFNOTHUNG | BSF_SENDNOTIFYMESSAGE;
int nbsm1 = ::BroadcastSystemMessage(dwFlgs, &bsmInfo1, WM_SETTINGCHANGE, 0, (LPARAM)L"Windows");
DWORD bsmInfo2 = BSM_ALLDESKTOPS;
int nbsm2 = ::BroadcastSystemMessage(dwFlgs, &bsmInfo2, WM_SETTINGCHANGE, 0, (LPARAM)L"WindowsThemeElement");

无济于事(我两次通话都收到1但是没有效果。

2 个答案:

答案 0 :(得分:1)

我能够resolve this .- .-。

答案 1 :(得分:0)

如果您的服务在与登录屏幕保护程序相同的会话中运行,则可以使用SPI_SETSCREENSAVETIMEOUT标记来呼叫SystemParametersInfo

SystemParametersInfo向所有顶级窗口广播WM_SETTINGCHANGE消息,以指示参数已更改。如果您的代码未在正确的会话中运行,那么您可以使用带有BSM_ALLDESKTOPS标记的BroadcastSystemMessage来发送WM_SETTINGCHANGE消息。但是,这确实需要SE_TCB_NAME权限,因此您的代码必须以SYSTEM身份运行。

我实际上没有尝试过这个跨会话,所以我无法保证它能够正常运行。