2

У меня есть служба Windows, которая может изменить тайм-аут на заставке входа в Windows Чтобы сделать это изменить следующий раздел реестра на тайм-аут в секундах (как described here.):Как обновить параметры параметров заставки заставки?

HKEY_USERS\.DEFAULT\Control Panel\Desktop\ScreenSaveTimeOut 

Вопрос заключается в том, что, как я делаю OS «read» или обновить фактический тайм-аут заставки после изменения в разделе реестра выше?

Моя практика показывает, что она обновлена ​​(конечно) только при перезагрузке системы, но в моем случае мне нужно, чтобы она была применена без перезагрузки.

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

Если служба запущена в том же сеансе, скринсейвера входа, то вы можете позвонить SystemParametersInfo с SPI_SETSCREENSAVETIMEOUT флагом.

SystemParametersInfo передает сообщение WM_SETTINGCHANGE во все окна верхнего уровня, чтобы указать, что параметр изменился. Если ваш код не работает в правильной сессии, вы можете использовать BroadcastSystemMessage с флагом BSM_ALLDESKTOPS, чтобы доставить сообщение WM_SETTINGCHANGE. Однако для этого требуется привилегия SE_TCB_NAME, поэтому ваш код должен работать как SYSTEM.

Я не пробовал эту кросс-сессию, поэтому я не могу гарантировать, что она работает.

+0

Я попробовал ваше предложение ..., пожалуйста, проверьте мой скорректированный вопрос. У вас есть идея, с какими флагами можно позвонить? – c00000fd

+0

Ваш код работает как SYSTEM? Если нет, функция будет успешной, но переменная 'bsmInfo1', которую функция обновляет, чтобы указать, кто получил это сообщение, не содержит флаг' BSM_ALLDESKTOPS'. Какую ценность вы получаете в 'bsmInfo1'? – arx

+0

И wParam и lParam должны быть 'SPI_SETSCREENSAVETIMEOUT' и" "соответственно, то есть' int nbsm = :: BroadcastSystemMessage (dwFlgs, & bsmInfo, WM_SETTINGCHANGE, SPI_SETSCREENSAVETIMEOUT, (LPARAM) L ""); '. – arx