我有一个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但是没有效果。
答案 0 :(得分:1)
我能够resolve this .- .-。
答案 1 :(得分:0)
如果您的服务在与登录屏幕保护程序相同的会话中运行,则可以使用SPI_SETSCREENSAVETIMEOUT
标记来呼叫SystemParametersInfo
。
SystemParametersInfo
向所有顶级窗口广播WM_SETTINGCHANGE
消息,以指示参数已更改。如果您的代码未在正确的会话中运行,那么您可以使用带有BSM_ALLDESKTOPS
标记的BroadcastSystemMessage
来发送WM_SETTINGCHANGE
消息。但是,这确实需要SE_TCB_NAME
权限,因此您的代码必须以SYSTEM身份运行。
我实际上没有尝试过这个跨会话,所以我无法保证它能够正常运行。