Bonjours, je viens de developper un programme en Delphi, qui tourne en tache de fond. Par contre des que je le ance, je n'arrive plus a fermer windows ou meme le redémmarrer.
Quelqu'un aurait une idée d'ou peut provenir le probléme?
Merci
Bonjours, je viens de developper un programme en Delphi, qui tourne en tache de fond. Par contre des que je le ance, je n'arrive plus a fermer windows ou meme le redémmarrer.
Quelqu'un aurait une idée d'ou peut provenir le probléme?
Merci
Beh en fait il detecte si une clé USB est branchée il lit des information dessus vérifie l'identité de la clé !
Puis lorsqu'on la debranche il fait la meme chose sauf qu'il remet tout a zéro. Mais il doit pas tout remettre correctement.
lol
C'est une sorte de DongleUSB.
Enfin je vois pas d'ou sa vient.
Si quelqu'un a une idée!
Merci
bonsoir
met un bout de code!!
à plus
Salut,
Tu dois intercepter le message WM_ENDSESSION qui permet de détecter l'arrêt d'une session Windows, donc sa fermeture. Tu dois le faire de la façon suivante :
Mets cette procédure au dessus de clause private :
Place une variable booléenne globale :
Code : Sélectionner tout - Visualiser dans une fenêtre à part procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
Ensuite écris ton code pour la procédure WMQueryEndSession :
Code : Sélectionner tout - Visualiser dans une fenêtre à part var bTerminated : boolean;
Et dans ta fonction Close :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION; begin inherited; bTerminated := True; end;
Voilà,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if bTeminated then Application.terminate;
A plus,
Chris
Merci pour la réponse,je test ca tout de suite.
Je viens de tester mais rien ne change voila mon 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 TFormUSB = class(TForm) ProgressBar1: TProgressBar; Label1: TLabel; Timer1: TTimer; procedure FormDestroy(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION; procedure EndSession(var Msg: TMessage); message WM_ENDSESSION; protected { Déclarations protégées } procedure WndProc(var Msg: TMessage); override; private { Déclarations privées } MsgID_QueryCancelAutoPlay: Integer; procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TFormUSB.WMQueryEndSession(var Message: TWMQueryEndSession); begin bTerminated := True; AutoRun:= FALSE; //Ici tes actions à faire GetRegistryValueStr('\Software\Intelys', 'serial', '', True, False); GetRegistryValueStr('\Software\Intelys', 'client','', True, False); GetRegistryValueStr('\Software\Intelys', 'user', '', True, False); GetRegistryValueStr('\Software\Intelys', 'plug', '0', True, False); end;Est ce que quelqu'un vois ou pourrait se trouver mon erreur?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TFormUSB.FormClose(Sender: TObject; var Action: TCloseAction); begin if bTerminated then Application.terminate; GetRegistryValueStr('\Software\Intelys', 'serial', '', True, False); GetRegistryValueStr('\Software\Intelys', 'client','', True, False); GetRegistryValueStr('\Software\Intelys', 'user', '', True, False); GetRegistryValueStr('\Software\Intelys', 'plug', '0', True, False); end;
Merci
J'ai oublier de préciser, mon application tourne en tache de fond,en tant que processus.
Encore un bout de code, la déclaration de mes variables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 var FormUSB: TFormUSB; bTerminated : boolean; AutoRun: Boolean; hFile,FenetreIE: THandle; applicationName,User,Client:string; HttpPost1,HttpPost2: THttpPost; VolSerial: Int64 ; GetLettre: string; VolName, FileSysName : Array[0..Max_Path]Of Char; FileMaxLen, FileFlags : DWord; Stream: TFileStream;
Salut,
Enlève la procédure permettant d'intercepter le message WM_ENDSESSION, pour voir... Peut-être qu'il y a un conflit...
A plus,
Christopher
Re,
Et surtout essaye de placer la déclaration de ta procedure en dessous de celle de WMDeviceChange, comme ceci :
Je pense que ça devrait fonctionner...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE; procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
A plus,
Chris
Juste un truc...
Si Windows ne se ferme pas, c'est parce que ton processus ne se termine pas ? ( en gros il reste dans la liste des processus )
Ou c'est autre chose ?
En tout cas dans le code proposé par lapec_et_cie je ne comprends pas pourquoi faire un test dans le OnClose, alors que si le processus bloque la fermeture, c'est que lui même ne passe pas dans le OnClose.
En gros le Application.Terminate devrai plutot se trouvé dans le EndSession. Non ?
Partager