如何刷新登录屏保参数更改?

Posted

技术标签:

【中文标题】如何刷新登录屏保参数更改?【英文标题】:How to refresh logon screensaver parameter changes? 【发布时间】:2014-01-13 06:32:12 【问题描述】:

我有一个 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,但它没有效果。

【问题讨论】:

【参考方案1】:

我可以resolve this.-.-.

【讨论】:

【参考方案2】:

如果您的服务与登录屏幕保护程序在同一会话中运行,那么您可以使用SPI_SETSCREENSAVETIMEOUT 标志调用SystemParametersInfo

SystemParametersInfoWM_SETTINGCHANGE 消息广播到所有***窗口以指示参数已更改。如果您的代码没有在正确的会话中运行,那么您可以使用带有BSM_ALLDESKTOPS 标志的BroadcastSystemMessage 来传递WM_SETTINGCHANGE 消息。但是,这确实需要 SE_TCB_NAME 权限,因此您的代码必须以 SYSTEM 身份运行。

我还没有真正尝试过这个跨会话,所以我不能保证它有效。

【讨论】:

我尝试了您的建议...请检查我调整后的问题。你知道用哪些标志来调用它吗? 您的代码是否以 SYSTEM 身份运行?如果不是,则函数成功,但函数更新以指示谁收到消息的bsmInfo1 变量不包含BSM_ALLDESKTOPS 标志。你在bsmInfo1 中得到了什么价值? 而 wParam 和 lParam 应该分别是 SPI_SETSCREENSAVETIMEOUT 和 "",即 int nbsm = ::BroadcastSystemMessage(dwFlgs, &bsmInfo, WM_SETTINGCHANGE, SPI_SETSCREENSAVETIMEOUT, (LPARAM)L""); 哦,我的错。是的,代码是从 LocalSystem 服务运行的。在 BroadcastSystemMessage 返回 1 之后,我相信这是成功的,bsmInfo1 设置为0x1F。即使您进行了修改,登录屏幕保护程序超时也不会改变。 您似乎需要在正确的会话中运行一些代码。抱歉,我无法提供更多帮助。

以上是关于如何刷新登录屏保参数更改?的主要内容,如果未能解决你的问题,请参考以下文章

更改 UIAppearence 后刷新标签栏

如何更改操作系统文件缓存刷新策略?

电脑如何取消屏保和休眠

idea Datebase如何刷新数据库

uni-app怎么让页面在登录进来刷新一次数据

更改Query Param不刷新路由