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

API, COM et SDKs Delphi Discussion :

comment utiliser le message WM_QUERYENDSESSION avec delphi6


Sujet :

API, COM et SDKs Delphi

  1. #1
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut comment utiliser le message WM_QUERYENDSESSION avec delphi6
    salut a tous.

    voila j'écris un petit programme avec delphi6 et je voudrais intercepter la fermeture de session windows ou l'arrêt de la machine, afin que cela ne soit accessible qu'aux personnes authorisées.

    voila en quelques mots comment mon algorithme fonctionne:
    1-lorsque le message WM_QUERYENDSESSION est émis, je l'intercepte dans une procédure.
    2-dépendamment de la configuration de l'application, je détermine si la réponse au message est oui (fermer windows) ou non (empêcher sa fermeture).
    3-afficher un message s'il est impossible de fermer windows.

    mais il y a probleme, mon application fonctionne parfois en arriere plan (aucune fenêtre visible), lorsque c'est le cas, elle empêche la fermeture de windows, mais n'affiche aucun message!

    j'aimerais bien savoir ou est ce qu'il faut placer la procédure pour gérer le message, car dans un premier temps je l'ai placée dans un gestionnaire d'évènement du contrôle AppEvents ( OnMessage ) puis j'ai crée une procédure de gestion de messages:
    procedure WMQueryEndSession(var msg:TWMQueryEndSession); message

    voila un extrait du code que j'utilise mais qui ne marche pas vraiment :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    function TfrmMain.QueryEndSession: Boolean;
    var
      pi: TCCMpopupInfos;
      r: Integer;
      noReboot, noShutDown, noLogOff: Boolean;
    begin
      {windows query to end session allow this ?}
      //def result = yes, allow this
      result := true;
      try
    	  noReboot    := CCMClientConfig.WRLockReboot;
    	  noShutDown  := CCMClientConfig.WRLockShutdown;
    	  noLogOff    := CCMClientConfig.WRLockLogOff;
    	  if  (noReboot)  or
    	      (noShutdown)or
    	      (noLogOff)  then begin
    	    if (fCanExitWindows)or((CCMClientConnection.ShuttedDown))then //begin//and(CCMClientConfig.AutoLaunch)) then
    	      result := true
    	    else begin
    	      //show this with popup
    	      pi.Title := PChar(c_dsccm2L);
    	      pi.Msg := PChar('Vous n''avez pas le droit de faire cela !');
      	    pi.FontSize := 14;
        	  pi.FontBold := true;
    	      	pi.FontItalic := false;
    	      pi.FontUnderlined := false;
      	    pi.FontColor := clBlue;
        	  pi.Buttons := 1;
    	      pi.TimeOut := 5;//10 seconds
      	    pi.Transparency := 0;//0%
        	  r := Popup( pi, nil, 0 );
    	      if r <= 0 then
      	      CCMErrorLogger.LogError&#40; 'PopupReturnCode='+IntToStr&#40;r&#41;,
        	       'MainForm',
          	     'TfrmMain.WMQueryEndSession',
            	   'Nothing' &#41;;
    	      Result &#58;= false;
      	  end;
    	  end
      	else
    	    result &#58;= true;
      except
      	on e&#58;exception do
    	  	CCMErrorLogger.LogError&#40; e.Message,
        	       'MainForm',
          	     'TfrmMain.QueryEndSession',
            	   'Nothing' &#41;;
      end;
    end;
    mais malheuresement cela ne marche que si la fenêtre est visible. Lorsqu'elle est invisible, le message avertissant l'utilisateur qu'il ne peut pas fermer windows n'apparait pas, et windows ne se ferme pas!

    merci à tous de m'aider à résoudre ce problème

  2. #2
    Inactif
    Inscrit en
    Août 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    F1 sur WM_QUERYENDSESSION

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Conficius, ce n'est pas parce que tout le monde te dit d'utiliser F1 qu'il faut que tu demandes ça aux autres. En l'occurence il n'y a pas d'aide sur ce sujet car c'est un message Windows et non un composant Delphi. Merci.

    Pour ton problème, il est plausible qu'un autre composant intercepte ce message quand ta fenêtre est invisible. Quels composants tiers utilises tu ?
    "It's more fun to compute !"

  4. #4
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    je n'utilise malheureusement pas de composant tiers, hormis ceux developpés par moi même. et je suis certain qu'aucun de ceux ci n'intercepte le message. en revanche j'utilise le composant TAppEvents su ma fiche principale, serait-ce la cause du problème? je dois préciser que ladite fiche pricipale n'est visible en aucun moment lors du déroulement du programme.

  5. #5
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    ps:
    c'est dans l'évènement OnMessage du TAppEvents que j'appelle ma fonction de test...

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/01/2008, 11h03
  2. Réponses: 13
    Dernier message: 25/04/2006, 10h43
  3. Comment utiliser les fichiers *.PNG avec Delphi ?
    Par HopeLeaves dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/09/2005, 21h59
  4. comment utiliser de l'OpenGL avec du Java ?
    Par DjiZ dans le forum OpenGL
    Réponses: 3
    Dernier message: 14/01/2004, 16h21
  5. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    Réponses: 3
    Dernier message: 05/10/2003, 20h47

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