[RESOLU] Intercepter la fermeture du programme

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
pyfux69
Messages : 4
Inscription : dim. 16/déc./2012 10:17

[RESOLU] Intercepter la fermeture du programme

Message 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.
Dernière modification par pyfux69 le lun. 17/déc./2012 21:07, modifié 1 fois.
Débutant en PureBasic
(désolé pour les questions...) :roll:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Intercepter la fermeture du programme

Message 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"
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Intercepter la fermeture du programme

Message 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 8) ", ç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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
pyfux69
Messages : 4
Inscription : dim. 16/déc./2012 10:17

Re: Intercepter la fermeture du programme

Message 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 :twisted: ), il faut que je sois informé de l'arrêt de ce programme.

:arrow: 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! :P
(J'étais inquiet quand à la communauté autour de PureBasic, mais quelle surprise! 2 réponses en moins de quelques heures. Super et merci à vous.)
Débutant en PureBasic
(désolé pour les questions...) :roll:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Intercepter la fermeture du programme

Message par Backup »

pyfux69 a écrit : :arrow: 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 !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Intercepter la fermeture du programme

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Intercepter la fermeture du programme

Message 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 ... ;)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Intercepter la fermeture du programme

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Intercepter la fermeture du programme

Message par nico »

J'ai retrouvé le fil ici pourla protection au niveau du taskmanager:
http://www.purebasic.fr/english/viewtop ... s&start=15
pyfux69
Messages : 4
Inscription : dim. 16/déc./2012 10:17

Re: Intercepter la fermeture du programme

Message 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.
Débutant en PureBasic
(désolé pour les questions...) :roll:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Intercepter la fermeture du programme

Message 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
pyfux69
Messages : 4
Inscription : dim. 16/déc./2012 10:17

Re: Intercepter la fermeture du programme

Message 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". :mrgreen:
Sorry à force de faire du VBA... :oops:

Ok je sors!
Débutant en PureBasic
(désolé pour les questions...) :roll:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Intercepter la fermeture du programme

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Intercepter la fermeture du programme

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Intercepter la fermeture du programme

Message 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)
Répondre