Page 1 sur 2

Fermer un programme

Publié : lun. 24/mai/2004 19:05
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

Publié : lun. 24/mai/2004 20:15
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

Publié : lun. 24/mai/2004 20:20
par Aranoth
Super ! Merci a toi et au Soldat Inconnu ! :D

Publié : lun. 24/mai/2004 22:03
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

Publié : lun. 24/mai/2004 22:47
par nico
Test le nom de la fenêtre avec les dix dernières lettres avec a$ = Right(chaine$,10)

Publié : mar. 25/mai/2004 9:07
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)

Publié : mar. 25/mai/2004 16:52
par Aranoth
merci, je verrais ce code un peu plus tard :D

Publié : mer. 10/nov./2004 8:04
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 ! :)

Publié : mer. 10/nov./2004 10:13
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

Publié : mer. 10/nov./2004 10:41
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

Publié : mer. 10/nov./2004 10:49
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

Publié : mer. 10/nov./2004 11:05
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

Publié : mer. 10/nov./2004 12:39
par gansta93
Justement, le dociert windows\system est leur endroit préféré, vu que c'est là qu'on ne les cherchera jamais.

Publié : mer. 10/nov./2004 13:00
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 ! . :)

Publié : mer. 10/nov./2004 13:09
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 :)