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:
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; |
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