У меня есть служба 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 в результате обоих вызовов, но это не имеет никакого эффекта.
я мог решить это.-.-.
Если ваша служба работает в том же сеансе, что и заставка входа, вы можете позвонить SystemParametersInfo
с SPI_SETSCREENSAVETIMEOUT
флаг.
SystemParametersInfo
транслирует WM_SETTINGCHANGE
сообщение всем окнам верхнего уровня, чтобы указать, что параметр изменился. Если ваш код не работает в правильном сеансе, вы можете использовать BroadcastSystemMessage
с BSM_ALLDESKTOPS
флаг для доставки WM_SETTINGCHANGE
сообщение. Тем не менее, это требует SE_TCB_NAME
привилегия, поэтому ваш код должен быть запущен как SYSTEM.
На самом деле я не пробовал эту кросс-сессию, поэтому я не могу гарантировать, что она работает.