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 :
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!
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( 'PopupReturnCode='+IntToStr(r), 'MainForm', 'TfrmMain.WMQueryEndSession', 'Nothing' ); Result := false; end; end else result := true; except on e:exception do CCMErrorLogger.LogError( e.Message, 'MainForm', 'TfrmMain.QueryEndSession', 'Nothing' ); end; end;
merci à tous de m'aider à résoudre ce problème
Partager