2

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

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,但没有效果。

4

2 回答 2

1

我能够解决这个问题.-.-。

于 2014-01-16T09:40:11.887 回答
0

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

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

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

于 2014-01-13T13:23:13.727 回答