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 !

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

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

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 !
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 !

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
