Fermer un programme

Programmation d'applications complexes
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Fermer un programme

Message par Aranoth »

Salut

Code : Tout sélectionner

RunProgram(NomFichier$, [, Parametre$, RepertoireCourant$ [, Options]]) 

avec cette commande on peut lancer un programme, mais est-il possible de le fermer depuis Pure après ?

Par exemple au lancement de mon appli je lance Bloc Note, ensuite quand je quitte mon appli, Bloc Note se quitte aussi... possible ?

Merci
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Oui, Le Soldat Inconnu l'a déja codé (Code du musée PureBasic) :

Code : Tout sélectionner

Procedure.l CloseProgram(nom.s)

; nom = nom de la fenêtre en cours
; valeur de retour de la procedure :
; 1 = OK
; 0 = erreur d'envoi du message d'arrêt au logiciel
; -1 = le logiciel n'est pas en cours d'exécution

 resultat = 1

 winHwnd = FindWindow_(vbNullString, nom)

 If winHwnd <> 0

   RetVal = PostMessage_(winHwnd, #WM_CLOSE, 0, 0)

   If RetVal = 0

     resultat = 0

   EndIf

 Else

   resultat = -1

 EndIf

 ProcedureReturn resultat

EndProcedure

CloseProgram("Calculatrice")
Démarre la calculatrice de Windows puis exécute ce code, la calculatrice se fermera toute seule.

A+
Guimauve
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

Super ! Merci a toi et au Soldat Inconnu ! :D
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

Autre problème !

le nom de la fenetre bloc note s'appelle:
[fichier] - Bloc-notes
Et [fichier] change quand on enregistre le fichier... :?


Y'a t'il une solution de le fermer quand meme ?

merci
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Test le nom de la fenêtre avec les dix dernières lettres avec a$ = Right(chaine$,10)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

et comme ça, je pense que c'est ce que tu cherches

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Pour récupérer le handle de la fenêtre de l'exécutable lancé

NewList Liste_Fenetres()
Structure PROCESSENTRY32
  dwSize.l
  cntUsage.l
  th32ProcessID.l
  *th32DefaultHeapID.l
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.b [260]
EndStructure
Procedure.l RunProgramEx(NomFichier$, Parametre$, RepertoireCourant$)
  Protected WindowID.l, hWnd.l, LastWindowID.l, pid.l, Process32Search.l
  ClearList(Liste_Fenetres())
  
  ; Fenêtre au premier plan
  WindowID = GetForegroundWindow_()
  
  ; On liste les fenêtres ouvertes
  hWnd.l = FindWindow_(0, 0)
  While hWnd <> 0
    If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE
      AddElement(Liste_Fenetres())
      Liste_Fenetres() = hWnd
    EndIf
    hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
  Wend
  
  ; On lance le programme
  RunProgram(NomFichier$, Parametre$, RepertoireCourant$)
  
  NomFichier$ = LCase(GetFilePart(NomFichier$))
  
  ; On cherche l'ID du la fenêtre créée
  Repeat
    Delay(50)
    
    LastWindowID = GetForegroundWindow_()
    
    If LastWindowID <> 0 And LastWindowID <> WindowID
      ; On compare avec la liste des fenêtres qui étaient ouvertes
      ResetList(Liste_Fenetres())
      While NextElement(Liste_Fenetres())
        If LastWindowID = Liste_Fenetres()
          WindowID = LastWindowID
        EndIf
      Wend
      
      If LastWindowID <> WindowID
        ; On vérifie le nom du programme dont on vient de récupérer le handle
        GetWindowThreadProcessId_(LastWindowID, @pid)
        If OpenLibrary(9000, "kernel32.dll")
          Process32Search = CallFunction(9000, "CreateToolhelp32Snapshot", 2, 0)
          If Process32Search
            DefType.PROCESSENTRY32 Proc32
            Proc32\dwSize = SizeOf(PROCESSENTRY32)
            If CallFunction(9000, "Process32First", Process32Search, @Proc32)
              Repeat
                If pid = Proc32\th32ProcessID And LCase(GetFilePart(PeekS(@Proc32\szExeFile))) <> NomFichier$
                  WindowID = LastWindowID
                EndIf
              Until CallFunction(9000, "Process32Next", Process32Search, @Proc32) = 0
            EndIf
            CloseHandle_(Process32Search)
          EndIf
          CloseLibrary(9000)
        EndIf
      EndIf
      
    EndIf
  Until LastWindowID <> 0 And LastWindowID <> WindowID
  
  ProcedureReturn LastWindowID
EndProcedure





; On lanec le prog
ID = RunProgramEx("notepad.exe", "", "")

; On change le titre
Texte.s = "Chopée"
SetWindowText_(ID, @Texte)

; On attend 5 secondes
Delay(5000)

; On ferme le programme
PostMessage_(ID, #WM_CLOSE, 0, 0)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

merci, je verrais ce code un peu plus tard :D
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Bonjour
Le Soldat Inconnu : J'ai un problème avec ta fonction .

En fait, cette fonction ferme la plupart des fenêtres ouvertes, mais pas toute.

Par ex: j'ai testé ta fonction avec Ad-Aware.
J'ai donc fait un RunProgram("C:\Pro...\Ad-Aware.exe") et dans une boucle infinie temporisée par une seconde, je fais CloseProgram("c:\Prog...\..exe") et j'ai le code '-1' en retour.

Or j'ai bien vérifié par Filse("C:\..") que je ne m'était pas trompé dans le nom du fichier.

Par contre pour un programme 'vide' que j'ai fait sous PB (il attend juste qu'oon appuie sur une touche), ta fonction marchait bien.

Donc est-ce que qq1 ne pourrait pas m'aider ???

Je vous posterez mon code cet aprem si vous voulez...
C'est pour un ami qui n'arrive pas à virer un programme au démarrage de Windows (mm en allant dans 'msconfig'). Donc mon programme devait tuer le programme qui prenait 100% de l'UC)


Merci d'avance ! :)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Et une question idiote mais qui m'interesse ...
Comment un arrête un programme qui n'a pas de fenêtre ?
Par exemple moi j'ai besoin d'arrêter la tache explorer.exe
Comment je peux faire ? il existe bien ce code

Code : Tout sélectionner

processID.l=RunProgram("truc.exe")
TerminateProcess_(processID, 0) 
mais je ne connais pas le ProcessID de explorer.exe ?

Bon peut être qu'il faut mieux que je pose ma question dans un autre sujet histoire de ne pas pourrir le post...si ça gène n'hesitez pas dite le moi et je poste ce message ailleur :P
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

c'est le nom de la fenêtre qu'il faut donner à la procedure CloseProgram.

Le problème est d'arriver à retrouver le handle de la fen du programme.
à partir de nom de la fen, c'est facile (le code donnée plus haut)
à partir de l'adresse de l'exe, c'est l'horreur (regarde sur PureArea, je croit qu'il y a un exemple)

dans l'autre code, je lance le programe avec PB et j'attends l'apparition d'une nouvelle fenêtre, dès que j'ai une nouvelle fen, je dis que c'est celle du programme que je viens de lancer. c'est une grosse bidouille et ça ne marche pas si tu lances 36 application à la fois
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Je vous posterez mon code cet aprem si vous voulez...
C'est pour un ami qui n'arrive pas à virer un programme au démarrage de Windows (mm en allant dans 'msconfig'). Donc mon programme devait tuer le programme qui prenait 100% de l'UC)
alors la, avec mon code, tu n'y arriveras jamais. sauf si le nom de la fen du programme est toujours la même et qu'il fait apparaitre une fenêtre.

tu vas dans de le gestionnaire des taches (ctrl alt suppr) et tu regardes le nom de l'exe

ensuite, regarde ce code

http://purebasic.hmt-forum.com/viewtopic.php?t=1024&

il te permettra de virer ton programme du démarrage
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

faut allez dans le registre pour arreter un programme de ce genre

dans le registre (regedit )
tu vas dans HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\

une fois la tu regarde dans le dossier RUNONCE <--- l'endroit preferé des troyen et des appli en cours d'installation

soit dans le dossier RUN qui contient tous les programme qui se lance au demarage de la machine , la faut regarder les path des applications
pour savoir quel est l'intru !!

et tu le delete !!! par contre faut faire gaffe car si tu te trompe tu peut virer un driver de carte video ou autre , mais dans tout les cas ça n'est jamais grave pour le system , surtout sur Xp qui se fera un plaisir de te signaler un problem de driver , qu'il faudrai alors reinstaller ! :D

si le path d'un programme donne sur "program file" tu peut effacer sans blem , au pire tu aura virer un programme du démarage
si le path donne sur "system' ou un truc du genre , laisse le ne l'efface pas
en principe dans le dossier run les virus et autre cheval de troie ne s'installe pas dans ce dossier qui est theoriquement protegé par le system ! :D
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Justement, le dociert windows\system est leur endroit préféré, vu que c'est là qu'on ne les cherchera jamais.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui peut etre , mais d'apres le nom de l'application tu peus savoir si c'est un programme que tu veux virer ou pas !!

sinon aucun utilitaire ne le saura non plus !!

a part les antivirus et anti troyen ,
mais dans la mesure ou tu veux virer un programme du demarage c'est que tu connais l'existence de ce programme , (sinon tu saurai mem pas qu'il se lance )

et la methode que je donne est la plus efficace pour virer n'importe quel programme "connu" (dont le nom est connu) , du system !!

sinon c'est sur si tu connais pas ton system tu vas galerer , le registre est prevu pour les gens qui maitrise un minimum ce qu'il font ! . :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Le mieux pour supprimer un prog au démarrage est d'utiliser un logiciel qui gère ça comme par exemple Starter qui est freeware et en français.

Je l'utilise, c'est nickel :)
Répondre