Bonjour,
Je ne sais pas trop si je suis sur le bon forum, ou si ce message serait mieux sur le forum "Windows"...

J'ai une appli qui s'éxécute sous Windows en tant que service avec le compte SYSTEM.
Sous certaines conditions, ce service doit éteindre l'écran. La méthode que je retrouve un peu partout est l'utilisation de SendMessage avec différentes variantes dans l'obtention du HANDLE sur une fenêtre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
//broadcast sur toutes les fenêtres
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2);
Mon soucis, c'est que depuis Vista, les service windows s'exécutent dans laSession 0 qui n'a pas de bureau et qui ne communique pas avec les autres sessions utilisateurs Sessions 1, 2 ... ==> Impossible de récupérer un Handle sur une fenêtre ou de faire un SendMessage qui fonctionne (tous les codes fonctionnent depuis le compte d'un user et ne fonctionnent pas depuis le service windows).

Je cherche donc un moyen de faire exécuter le SendMessage dans une session utilisateur.

J'ai envisagé plusieurs solutions:
  • Rebondir sur une appli lancée à l'ouverture de la session USER ==> pas possible, je dois pouvoir le faire si il n'y a pas de session ouverte
  • Céer un processus en utilisant le compte d'un user
La seconde solution me parait la plus envisageable. Si une session est ouverte, je peux récupérer le token d'un user via WTSQueryUserToken puis faire un CreateProcessAsUser ou un CreateProcessWithTokenW.
Par contre, là encore, comment faire si il n'y a pas de session Windows d'ouverte (sachant que j'ai les droits system mais que je ne connais aucun mot de passe de user).

Je suis preneur de toute idée

Merci beaucoup!!!