Page 1 sur 1
[RESOLU] Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 10:28
par pyfux69
Bonjour,
J'ai un programme (sans fenêtre) qui tourne en permanence.
Je souhaite intercepter sa fermeture (lors de l'arrêt de l'OS ou après un "arrêter le processus" du gestionnaire de tâches) afin de fermer propremment les fichiers créés/ouverts.
Comment intercepter cet evènement? (j'ai déjà une boucle sans fin pour ma tâche principale)
D'avance merci.
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 10:48
par Backup
pyfux69 a écrit :afin de fermer propremment les fichiers créés/ouverts.
CloseFile(#Fichier)
Description
Ferme le #Fichier qui ne pourra plus être utilisé ultérieurement. Lorsqu'un fichier est fermé, toutes ses informations sont effectivement écrites sur le disque.
Note: tous les fichiers restant ouverts sont automatiquement fermés quand le programme se termine.
Note2 :
lorsque ton prg se termine ( de lui meme ou bien par le system )
c'est l'evenement "#PB_Event_CloseWindow" qui va arriver
donc normalement si tu veux effacer un fichier systeme , ou bien chercher a relancer ton prg , parce que tu veux continuer a espionner
l'ordi sur lequel il est installé , ben c'est a cette événement qu'il faut réagir ...
pour fermer/ecrire des fichiers, ça se fait tout seul .. comme par magie !
une boucle bien faite contient le Case gerant l'evenement "#PB_Event_CloseWindow"
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 12:23
par Ar-S
Bonjour et bienvenue.
A mon avis tu ne prends pas le truc dans le bon sens.
si ton programme crée/lit/ouvre/sauve un document. Il ne faut pas faire une boucle genre :
- Si monexe se ferme alors sauve mon fichier
Il faut plutôt que tu ouvres/sauves/fermes ton document à chaque action de l'utilisateur. Ainsi que ton exe soit fermé par le système ou tué dans le gestionnaire de tâche ou fermé proprement par un "raccourcis clavier secret

", ça ne change rien à l'affaire. Ton document tiers sera toujours bien clos.
P.S : Comme l'a fait remarqué Dobro, ta description sent l'espiongiciel à plein nez. Si tel est ton but, renseigne toi sur les textes de Loi à ce sujet. Sinon oublie cette phrase.
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 15:00
par pyfux69
Bonjour à tous,
En effet il s'agit d'un espion logiciel. Le but est de remonter en base de données des fichiers de traces créés par une appli de gestion, afin de faire de stats et des analyses. Peu importe la raison (bonne ou mauvaise

), il faut que je sois informé de l'arrêt de ce programme.

Attention, ce n'est pas un programme interactif, il n'y a aucune fenêtre ouverte.
Donc la solution WindowEvent ne me convient pas vraiment.
Y a-t-il une autre solution?
(en dernier recours je construit un service mais c'est un peu lourd pour ce petit dev!)
A vos claviers!
(J'étais inquiet quand à la communauté autour de PureBasic, mais quelle surprise! 2 réponses en moins de quelques heures. Super et merci à vous.)
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 19:43
par Backup
pyfux69 a écrit :

Attention, ce n'est pas un programme interactif, il n'y a aucune fenêtre ouverte.
Donc la solution WindowEvent ne me convient pas vraiment.
?? ben si !
tu peux ouvrir une fenêtre invisible ..
dans un system multitâche moderne, c'est meme quasi obligatoire !
une fenêtre peut etre invisible , et même caché en barre des taches
ton application est donc en fenêtre comme la quasi totalité des applications windows ...
ça te donne accès a une boucle d'event, et donc ma réponse correspond !
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 19:57
par falsam
pyfux69 a écrit :... Je souhaite intercepter sa fermeture (lors de l'arrêt de l'OS ou après un "arrêter le processus" du gestionnaire de tâches)
Bonjour pyfux69 et bienvenu. Je pense que quelqu'un de beaucoup plus aguerri à Pure basic pourra le confirmer .... ou pas, mais je pense qu'il n'est pas possible d'écrire un programme qui teste si son activé est interrompu par un Kill process ou bien par l’arrêt de l'ordinateur.
Par contre il est possible de coder un exe qui surveillera l'activité d'un autre exe. Restera le souci de l’arrêt de l'ordinateur.
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 20:09
par Backup
falsam a écrit :pyfux69 a écrit :... Je souhaite intercepter sa fermeture (lors de l'arrêt de l'OS ou après un "arrêter le processus" du gestionnaire de tâches)
Bonjour pyfux69 et bienvenu. Je pense que quelqu'un de beaucoup plus aguerri à Pure basic pourra le confirmer .... ou pas, mais je pense qu'il n'est pas possible d'écrire un programme qui teste si son activé est interrompu par un Kill process ou bien par l’arrêt de l'ordinateur.
Par contre il est possible de coder un exe qui surveillera l'activité d'un autre exe. Restera le souci de l’arrêt de l'ordinateur.
si c'est possible ...
comme je le dis, en surveillant l'event !
car meme lorsque tu arrete un prg par un kill process , je pense que l'event de fermeture est envoyé a l'application par Windows ...
la preuve.. les malwares , t'empeche meme de les supprimer par ce moyen ...

Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 20:19
par nico
L arret de l ordinateur peut etre detecter, de memoire WM_QUERYENDSESSION
Par contre l arret brutale par le gestionnaire de tache, je ne sais pas mais je vois deux solutions:
A partir de vista, il y a un code qui permet d empecher l arret par le gestionnaire de tache, vu sur le forum anglais
L autre solution, comme falsam serait de creer deux exe qui se surveille l un a l autre
PS:DESOLE POUR L ECRITURE, J UTILISE UNE TABLETTE
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 21:02
par nico
J'ai retrouvé le fil ici pourla protection au niveau du taskmanager:
http://www.purebasic.fr/english/viewtop ... s&start=15
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 21:06
par pyfux69
Bonsoir,
Merci pour toutes ces pistes.
En effet, une fenêtre invisible répond à ma question.
Quand au WM_QUERYENDSESSION, mon programme doit tourner "sans être dans un session utilisateur". Donc cela ne rentre pas exactement dans mon besoin.
Que le "kill" soit envoyé par le gestionnaire de tâche où à l'arrêt de l'OS il faut que je puisse réaliser mes tâches avant la fermeture "forcé par windows au bout de quelques secondes".
Je crois que je vais creuser la création d'un service Windows.
Ce tutoriel me semble une très bonne piste:
http://f-lefevre.developpez.com/tutorie ... e-windows/
(voir #SERVICE_CONTROL_STOP)
Merci à tous.
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 21:15
par nico
Quand au WM_QUERYENDSESSION, mon programme doit tourner "sans être dans un session utilisateur". Donc cela ne rentre pas exactement dans mon besoin
tu fais comment pour faire tourner un programme sans etre dans une session ?
une session = ouverture de window = un compte
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 21:27
par pyfux69
Il me semblait que les applications lancées en automatique (clef Run) n'avaient pas besoin d'une session "utilisateur".
En réfléchissant, tu as certainement raison...
Donc, pas d'autre solution qu'un service...
C'est dommage qu'il n'y ait pas une sorte d’événement "Terminate".
Sorry à force de faire du VBA...
Ok je sors!
Re: Intercepter la fermeture du programme
Publié : dim. 16/déc./2012 21:39
par nico
C'est dommage qu'il n'y ait pas une sorte d’événement "Terminate".
Au risque de me répéter, si , c'est WM_QUERYENDSESSION
Re: Intercepter la fermeture du programme
Publié : lun. 17/déc./2012 11:36
par falsam
nico a écrit :Au risque de me répéter, si , c'est WM_QUERYENDSESSION
parfois il faut se répéter. Merci pour cette info que je ne connaissais pas Nico
Cet exemple, sauvegardé et compilé sous Window 7, montre comment intercepter l’arrêt du système d'exploitation et enregistrer des données dans un fichier. Afin de satisfaire partiellement à la demande de pyfux69, la fenêtre est invisible.
Code : Tout sélectionner
Enumeration
#MainForm
#Fichier
EndEnumeration
Procedure WindowsCallback(WindowID,Message,wParam,lParam)
If Message=#WM_QUERYENDSESSION
result = MessageRequester("Arret System", "Sauvegarder le projet ?", #PB_MessageRequester_YesNoCancel)
If result = #PB_MessageRequester_Yes
If CreateFile(#Fichier, "test.txt")
WriteString(#Fichier, "Arret du system Sauvegarde du projet.")
CloseFile(#Fichier)
EndIf
EndIf
ProcedureReturn #True
Else
ProcedureReturn #PB_ProcessPureBasicEvents
EndIf
EndProcedure
;La fenetre est invisible
OpenWindow(#MainForm, 0, 0, 200,200,"Test #WM_QUERYENDSESSION",#PB_Window_SystemMenu|#PB_Window_Invisible)
SetWindowCallback(@WindowsCallback())
Repeat
Event = WaitWindowEvent(10)
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Exécuter ce code
depuis le fichier compilé et arrêter votre ordinateur pour voir le résultat.
Re: Intercepter la fermeture du programme
Publié : lun. 17/déc./2012 12:25
par nico
En fait, WM_QUERYENDSESSION fait part d'une demande de fermeture de session ou de window et on doit répondre si on l'accepte ou pas mais c'est le message WM_ENDSESSION qui donne le résultat de la requete. Chose que je n'avais pas pris en compte lorsque j'avais posté un premier code dans trucs et astuces.
il vaut mieux sauver ses données au premier message (on a 5 secondes pour répondre, ce qui permet de sauvegarder ses données)