IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Reveiller l'écran de veille


Sujet :

Delphi

  1. #1
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut Reveiller l'écran de veille
    Bonjour à tous,

    WINDOWS 10 / DELPHI 10.2 update 3

    Je souhaiterai réveiller l'écran de veille à un moment donné depuis mon application.

    J'ai essayé plein de truc mais rien ne fonctionne, comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SendMessage(Application.Mainform.handle,WM_KEYDOWN,VK_SPACE,Makelong(0,MapVirtualKey(VK_SPACE,
    SendMessage(Application.Mainform.handle,WM_KEYUP,VK_SPACE,Makelong(0,MapVirtualKey(VK_SPACE,0)));
    SendMessage(0, WM_MOUSEMOVE, 0, MAKELPARAM(468, 580));
    SendMessage(Application.Mainform.handle, WM_MOUSEMOVE, 0, MAKELPARAM(468, 580));
     
    mouse.cursorpos := point(mouse.cursorpos.x+5,mouse.cursorpos.y+5);
    mouse.cursorpos := point(mouse.cursorpos.x-5,mouse.cursorpos.y-5);
    SendMessage(0, WM_MOUSEMOVE, 0, MAKELPARAM(468, 580));
    SendMessage(Application.Mainform.handle, WM_MOUSEMOVE, 0, MAKELPARAM(468, 580));
    Si quelqu'un a une solution ???
    merci
    Franck

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 677
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 677
    Points : 13 082
    Points
    13 082
    Par défaut
    Je doute que ce soit si simple. Le ScreenSaver n'est pas lancé sur le bureau de l'utilisateur (Default desktop), il tourne sur son propre bureau (ScreenSaver desktop).
    Ne pas oublier qu'il y a trois desktops par session : Default, Winlogon et Screensaver, chacun étant isolé des autres.

    Je pense que la seule solution serait de passer par un service pour pouvoir lancer une app par CreateProcessAsUser en ciblant ce bureau. Ensuite seulement tu pourrais envoyer des commandes.

    Ne peux-tu pas simplement empêcher la mise en veille ? Ça se fait par SetThreadExecutionState.

  3. #3
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Merci pour ces conseils mais effectivement ce n'est pas simple et voilà la solution que j'ai adopté.

    Je liste tous les processus en cours d'exécution.
    Si un des processus à un nom qui se termine par .scr c'est que le screensaver est en execution, et donc je tue la tache correspondante.

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    uses system,winapi.windows,Winapi.TlHelp32;
    //------------------------------------------------------------------------------------------------------------------------------
    Function StopScreenSaver:Boolean;
    var
      Snapshot: THandle;
      pe: TProcessEntry32;
      S:string;
    Begin
      result := false;
      Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
      try
        pe.dwSize := SizeOf(pe);
        if Process32First(Snapshot, pe) then
        while (Process32Next(Snapshot, pe)) do
        Begin
          S := pe.szExeFile;
          if CompareText(copy(S,pos('.',S),length(S)),'.scr')=0 then
          Begin
            result := boolean(TerminateProcess( OpenProcess(PROCESS_TERMINATE,BOOL(0), pe.th32ProcessID), 0));
          End;
        End;
      finally
        CloseHandle(Snapshot);
      end;
    End;

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 677
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 677
    Points : 13 082
    Points
    13 082
    Par défaut
    Ce qui veut dire que la sortie de veille n'est pas protégée par mot de passe. Dans ce cas effectivement l'écran de veille est une simple app tournant sur le bureau utilisateur.

    MSDN :
    Whenever a secure screen saver activates, the system automatically switches to the ScreenSaver desktop, which protects the processes on the default desktop from unauthorized users. Unsecured screen savers run on Winsta0\Default.
    Mais inutile de dire que ton approche n'est pas universelle, ne fonctionnera probablement pas si bureau sécurisé. Que ce passe-t-il si le processus lié au ScreenSaver desktop est tué, est-ce que le système va automatiquement commuter sur le Winlogon desktop ou vas-tu te retrouver avec un bel écran noir

    Sans compter que ton app devra obligatoirement tourner avec des privilèges administrateurs.

  5. #5
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Mon appli est très spécifique (SCADA) et fonctionne sur un PC dédié que je peux configurer moi même donc pas trop de problèmes de ce coté là.
    En revanche avec la dernière version de windows 10, au bout d'un moment, l'écran bascule sur l'écran de logon (image de paysage fixe) qui nécessite de cliquer sur le bouton pour se logger même si aucun mot de passe n'est requis, et je ne sais pas comment retirer ça !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C]Lancer l'écran de veille
    Par The Lord of Nesquik dans le forum Windows
    Réponses: 2
    Dernier message: 16/05/2006, 18h22
  2. Lancer l'écran de veille
    Par The Lord of Nesquik dans le forum C
    Réponses: 9
    Dernier message: 14/05/2006, 20h17
  3. [VB]écran de veille qui reste en icone réduite
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 25/04/2006, 23h51
  4. [VB6] activer Écran de veille
    Par Jean-François Boileau dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 31/03/2006, 22h22
  5. Creer un écran de veille
    Par Willand dans le forum C++Builder
    Réponses: 2
    Dernier message: 09/08/2002, 12h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo