Détecter les fermetures des fenetres extérieures [Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Détecter les fermetures des fenetres extérieures [Résolu]

Message par Kwai chang caine »

Bonjour à tous.

Voila, je voudrais savoir si il est possible de détecter la fermeture d'une fenetre ou application extérieure.

Je m'explique, ma collegue manipule un certain nombre d'appli simultanément et à la facheuse tendance de cliquer la croix au lieu du trait pour la mise en barre des taches.
Cette manoeuvre accidentelle l'oblige à chaque fois à redémarrer l'appli concernée, elle y perd meme parfois quelques données quand l'appli ne pose pas la fameuse question qui fait peur : "Voulez vous vraiment fermer, vous perdez toutes vos données" :roll:

Donc je me suis demandé si quelqu'un de ce forum connaissait une combine pour intercepter ce clic sur cette satané croix, pour y glisser un message box "Désirez vous vraiment quitter ...."

Connaissant la puissance de pure et en plus elle est charmante........................, que voulez vous, on ne se refait pas. :D
D'habitude c'est un ZORRO qui viens au secours des jolies dames, pour une fois comme ce sera moi se sera un ZéRO :lol: :lol:

Je vous remercie.
Bonne journée à vous
Dernière modification par Kwai chang caine le sam. 05/mai/2007 20:58, modifié 1 fois.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

avec l'api tu peut surement arriver a quelque chose tu a findwindow_() qui te permetra de recuperer le handle d'un aplication apres il doit y avoir plusieur facon de s'en servir.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonjour chaos

Effectivement cette API permet, je crois, de trouver un fenetre lorsque l'on connait son handle, ou bien de savoir si ce handle existe, enfin une histoire comme ça. :roll:

Mais ce que je voudrais c'est plutot intercepter le clic souris sur cette fenetre et particulierement sur la croix de fermeture.

Existe t'il un message de window signalant qu'il va fermer ou bien intercepter la fermeture juste avant qu'elle ne s'effectue.

Peut etre que ce n'est pas possible..... :cry:

J'ai cherché,mais je n'ai trouvé que l'interception de la fermeture de windows, un code de NICO.
Mais si y'a plus windows, y'a tout noir, et la c'est peut etre un peu tard :lol:
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

findwindow te retourne le handle apres va voir du coté de http://msdn.microsoft.com/library/defau ... essage.asp et si tu veut voir a peu pret comment sa marche la gestion des message une fois que tu les a recuperé va voir ici http://chgi.developpez.com/windows/message/


edit : j'ai relue ton message j'avait mal comprit ce que tu voulais et je pense pas que tu puisse bloquer la fermeture d'un processus comme sa
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Je te remercie beaucoup CHAOS de ton aide.
Apparement, tu ne voit pas ça impossible.
C'est déjà un espoir.

Par contre n'oublie pas que je suis un débutant de chez débutant qui écrit dans la rubrique débutant. :D

Y'a écrit noir de choses dans les liens que tu m'a donné, mais a part chaque mot seul (et encore) je n'arrive pas bien à comprendre tous les mots réunis, en plus il sont pas de notre patois (Cerise sur le gateau) :lol:

T'aurais pas dans ton escarcelle un petit exemple de quelques lignes pour m'aider à démarrer.
J'aime bien les américains, mais je comprend pas grand choses aux sons qui sortent de leur bouche :lol:

Quoi qu'il en soit, je te remercie encore de ton aide 8)
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

pour faire clair findwindow peut te donner l'identifiant de la fenetre apres avec getmessage (que je n'ai jamais reussi a utiliser en pb) tu recupere a la maniere d'un getevent les diferents evenement donc tu peut intercepter la fermeture le problem c'est que a moin de modifier l'aplication je pense pas que tu puisse influer sur quoi que se soit pour eviter la fermeture.
par contre tu peut créer une fenetre et faire en sorte que la fenetre de l'aplication devienne fille de celle que tu vient de crée ce qui te donne la liberté pour gerer la fermeture de la fenetre j'avait vue sa quelque part je ne sait plus ou peut etre purearea ....
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Exemple avec clic sur la croix ou clic sur bouton :

Code : Tout sélectionner

Enumeration 
 #WIN_TEST
 #btn_close
EndEnumeration

Procedure.l Fermeture() 
  If MessageRequester("AVERTISSEMENT AVANT FERMETURE", "ASSUREZ-VOUS D'AVOIR ENREGISTRE LES MODIFICATIONS APPORTEES A VOTRE TRAVAIL  !" + Chr(13) + "" + Chr(13) + "Si vous avez modifié une liste, enregistrez la avant de quitter le programme," + Chr(13) + "sinon les modifications ne seront pas prises en compte." + Chr(13) + "" + Chr(13) + "Si vous n'avez rien à enregistrer, cliquez sur OUI" + Chr(13) + "" + Chr(13) + "Si vous devez enregistrer des modifications, cliquez sur NON", #MB_ICONEXCLAMATION | #PB_MessageRequester_YesNo) = 6 
    ProcedureReturn 1 ;clic sur Oui
  Else 
    ProcedureReturn 0 ;clic sur non
  EndIf 
EndProcedure

If OpenWindow(#WIN_TEST,0,0, 400, 210,"Window test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)=0 Or CreateGadgetList(WindowID(#WIN_TEST))=0  
    End 
  EndIf
  
  ButtonGadget(#btn_close,150,150,100,20,"Fermer")
 
    
  Repeat
  EventID = WaitWindowEvent() 
  Select EventID 
    Case #PB_Event_Gadget 
      Select EventGadget() 
        

          Case #btn_close: Quitter = Fermeture() ; marche aussi sur un bouton

      EndSelect  
      
    Case #PB_Event_CloseWindow :Quitter = Fermeture(); clic sur cette satanée croix en haut à droite
      
  EndSelect 
  
Until Quitter

End
Ceci pour une appli en PB, mais pour un exe extérieur cela me paraît difficile sans modifier l'appli elle même. Un hook peut-être...
Le plus simple c'est que ta copine fasse gaffe où elle met les doigts :D
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Je vous remercie tous les deux de vous pencher sur mon probleme.
Cela m'ouvre deux solution. 8)

C'est vrai que peut etre un hook, mais on tombe encore dans le domaine du quasi interdit, ce qui veut dire pas beaucoup de code qui se promene:?

Aaaahhhh ! les femmes (Sauf LNA, bien sur :lol: ) elle sont pas nées avec un pc dans leur berceau :D

Encore merci, et si quelqu'un a une autre idée plus discrete, je suis preneur :wink:
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Salut Kwai machin truc chose .... :lol:

J'ai piraté ici et là des lignes de programmes qui peuvent t'interessées !

1 - Compiler le code ci-après en format DLL sous c:\CBTHook.dll ou modifier le code en consequence !

Code : Tout sélectionner


Structure Partage
  Hook.l
  hwnd.l
  Donnee1.l
  Donnee2.l
  Donnee3.l
  Donnee4.l
  Donnee5.l
EndStructure

Global MemoirePartagee,*VueDonnees.Partage

#WM_MONMESSAGE=111

Procedure CbtHook(nCode,wParam,lParam)
  If nCode < 0
    ProcedureReturn CallNextHookEx_(Hook,nCode,wParam,lParam)
  Else
    
    Select nCode
      Case #HCBT_ACTIVATE
        *Activate.CBTACTIVATESTRUCT=lParam
        *VueDonnees\Donnee1=wParam
        *VueDonnees\Donnee2=*Activate\fMouse
        
      Case #HCBT_CLICKSKIPPED
        ;Ici je ne traite pas
        
      Case #HCBT_CREATEWND
        *VueDonnees\Donnee1=wParam
        
      Case #HCBT_DESTROYWND
        *VueDonnees\Donnee1=wParam
        
      Case #HCBT_KEYSKIPPED
        *VueDonnees\Donnee1=wParam
        
      Case #HCBT_MINMAX
        *VueDonnees\Donnee1=wParam
        *VueDonnees\Donnee2=lParam & $FFFF
        
      Case #HCBT_MOVESIZE
        *Rect.RECT=lParam
        *VueDonnees\Donnee1=wParam
        *VueDonnees\Donnee2=*Rect\left
        *VueDonnees\Donnee3=*Rect\top
        *VueDonnees\Donnee4=*Rect\right
        *VueDonnees\Donnee5=*Rect\bottom
        
      Case #HCBT_QS
        ;Ici je ne traite pas
        
      Case #HCBT_SETFOCUS
        *VueDonnees\Donnee1=wParam
        
      Case #HCBT_SYSCOMMAND
        ;Ici je ne traite pas
    EndSelect
    
  EndIf
  
  SendMessage_(*VueDonnees\hwnd, #WM_MONMESSAGE, nCode, 0)
  
  ProcedureReturn CallNextHookEx_(Hook,nCode,wParam,lParam)
EndProcedure


ProcedureDLL AttachProcess(Instance)
  MemoirePartagee=CreatefileMapping_($FFFFFFFF,#Null, #PAGE_READWRITE, 0, SizeOf(Partage),"Mapping")
  *VueDonnees=MapViewOfFile_(MemoirePartagee, #FILE_MAP_WRITE, 0, 0, 0)
EndProcedure

ProcedureDLL DetachProcess(Instance)
  UnmapViewOfFile_(VueDonnees)
  CloseHandle_(MemoirePartagee)
EndProcedure
 
ProcedureDLL AttachThread(Instance)
EndProcedure
 
ProcedureDLL DetachThread(Instance)
EndProcedure
 
ProcedureDLL Initialiser_Hook(Handle,hInst)
  *VueDonnees\hwnd=Handle
  Hook = SetWindowsHookEx_(#WH_CBT,@CbtHook(),hInst,0)
  If Hook = #False
    MessageRequester("","Echec du Hook")
    ProcedureReturn 0
  EndIf
  *VueDonnees\Hook=Hook
  ProcedureReturn *VueDonnees
EndProcedure   


ProcedureDLL Fermeture_Hook()
  UnhookWindowsHookEx_(*VueDonnees\Hook)
  ProcedureReturn 1
EndProcedure

2 - lancer le code suivant ! (je ne te cache pas qu'il y a moyen d'amméliorer serieusement ! :oops:

Code : Tout sélectionner


Global Foc1,Event.s, x
#Librairie = 0
#WM_MONMESSAGE=111
Structure Partage2
  Hook.l
  hwnd.l
  Donnee1.l
  Donnee2.l
  Donnee3.l
  Donnee4.l
  Donnee5.l
EndStructure
Global *Vue.Partage2

Procedure ProcedureCallback(WindowID, message, wParam, lParam)
  Resultat = #PB_ProcessPureBasicEvents
  Select message
    Case #WM_MONMESSAGE
      Select wParam
        Case  #HCBT_SETFOCUS
          x= *Vue\Donnee1
          If x <>0 And Foc1 >-1
            Foc1=x
          EndIf
          Debug Foc1
        Case#HCBT_DESTROYWND
          If Foc1 = *Vue\Donnee1
            Fenetre.s=Space(200)
            GetWindowText_(Foc1,@Fenetre,200)
            Foc1=-1
            MessageRequester("Fermeture détectée","Fenêtre : - "+Fenetre)
            End
          EndIf
      EndSelect
  EndSelect
  ProcedureReturn Resultat
EndProcedure


If OpenWindow(0,0,0,120,0,"Pour quitter",#PB_Window_SystemMenu|#PB_Window_TitleBar)
  SetWindowCallback(@ProcedureCallback())
  Hmodule = OpenLibrary(#Librairie, "c:\CBTHook.dll")
  *Vue=CallFunction(#Librairie, "Initialiser_Hook", WindowID(0),Hmodule)
  If *Vue=0
    MessageRequester("Info", "Erreur")
  EndIf
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow Or Event ="Fin"
  If CallFunction(#Librairie, "Fermeture_Hook")=0
    MessageRequester("Info", "Erreur")
  EndIf
EndIf


Dernière modification par brossden le sam. 28/avr./2007 13:31, modifié 2 fois.
Denis

Bonne Jounée à tous
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

J'ai corrigé mon erreur (deux fois le même code !! :oops:

Après verif il y a un autre problème je regarde !!
Désolé !
Dernière modification par brossden le sam. 28/avr./2007 13:32, modifié 1 fois.
Denis

Bonne Jounée à tous
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

brossden a écrit :J'ai corrigé mon erreur (deux fois le même code !! :oops:

Après verif il y a un autre problème je regarde !!
Désolé !
Oui il manque des fonctions !

Et normallement ça peut pas marcher, car un "Debug" dans une DLL... je ne vois pas pourquoi ca marcherait !!! (vu qu'on n'ets plus en débuggage !)

Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Tous fonctionne c'est verifié !

Désolé mais en faisant des copier / coller j'ai fait des betises !

Le code est bon dans le post plus haut !
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Mon cher DENIS

Tu es une vraie mere pour moi :D
Je te remercie beaucoup pour ce joli code 8)

Mais comment faites vous pour sortir des codes aussi puissants et efficaces :twisted:
J'en reviens pas, tu as réalisé l'irréalisable à mes yeux, encore bravo.
ça parraissait tellement compliqué, ce que je demandais.

Effectivement ça marche de la balle chez moi :D

Par contre ce qui est rigolo, c'est que certaines fenetres ne sont pas détectées 8O

J'en ai testée quelques unes pour te donner une idée......

Les fermeture des fenetres détectées sont :

L'explorateur, VB6, Winzip, WinVI (Traitement texte pr LINUX), Internet explorer,VNC, WORD,Excell

Les fermeture des fenetres non-détectées sont :

PbConverter, RawWrite (Sous dos), NotePad, Pure basic v3.94, MS ACCESS, Nero burning rom,Photo+, Photo Filtre, I-photo express

Saurait tu pourquoi certaines fermetures de programme sont détectées par ton , super, génial, mirobolant, excelentissime code :D (et je reste modeste, faut pas en faire trop, car tu pourrais croire que je suis un flatteur :lol: ), donc saurait tu pourquoi certaines fermetures de programme sont détectées et pas certaines autres.

Il y aurait donc des gestions de fenetres differentes ???
Ce qui est sur c'est que l'ouverture, est elle détectée.

Encore bravo, j'suis encore sur le c....
Décidémént rien n'arrette pure basic et ses maitres.....

Excelente journée
Répondre