J’ai un service Windows qui peut modifier le délai d’attente sur l’économiseur d’écran de connexion Windows (comme décrit ici .) Pour ce faire, je remplace la clé de registre suivante par le délai d’attente en secondes:
HKEY_USERS\.DEFAULT\Control Panel\Desktop\ScreenSaveTimeOut
Le problème est que, comment puis-je faire en sorte que le système d’exploitation “lise” ou actualise le délai d’attente de l’économiseur d’écran après une modification de la clé de registre ci-dessus?
Ma pratique montre qu’il est actualisé (à coup sûr) uniquement lorsque je redémarre le système, mais dans mon cas, j’ai besoin de l’appliquer sans le redémarrage.
EDIT_1: Après la suggestion ci-dessous, j’ai essayé, comme il me semble, toutes les combinaisons possibles des drapeaux pour les éléments suivants:
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");
en vain 🙁 Je reçois 1 à la suite des deux appels mais cela n’a aucun effet.
J’ai pu résoudre ce problème .-.-.
Si votre service s’exécute dans la même session que l’économiseur d’écran de connexion, vous pouvez appeler SystemParametersInfo
avec l’indicateur SPI_SETSCREENSAVETIMEOUT
.
SystemParametersInfo
diffuse le message WM_SETTINGCHANGE
dans toutes les fenêtres de niveau supérieur pour indiquer qu’un paramètre a été modifié. Si votre code ne s’exécute pas dans la session correcte, vous pouvez utiliser BroadcastSystemMessage
avec l’indicateur BSM_ALLDESKTOPS
pour transmettre le message WM_SETTINGCHANGE
. Toutefois, cela nécessite le privilège SE_TCB_NAME
. Votre code doit donc être exécuté en tant que SYSTEM.
Je n’ai pas vraiment essayé cette session intersessions, donc je ne peux pas garantir que cela fonctionne.