Savoir si une application est ouverte ou fermée

Gadot Messages postés 7 Date d'inscription mercredi 19 décembre 2001 Statut Membre Dernière intervention 8 novembre 2002 - 19 déc. 2001 à 20:23
madcow41 Messages postés 54 Date d'inscription vendredi 12 avril 2002 Statut Membre Dernière intervention 11 mars 2008 - 25 août 2002 à 10:41
Mon programme vb6 lance différentes applications en utilisant shell. Ai-je un moyen de connaître l'état d'une application : ouverte ou fermée ? J'ai cru comprendre qu'il fallait avoir le " handle " de l'application, mais comment le connaitre ?

Merci à celui qui m'aidera.
Gadot

4 réponses

ZTPdiffusion Messages postés 46 Date d'inscription lundi 16 avril 2001 Statut Membre Dernière intervention 7 mars 2002
19 déc. 2001 à 21:26
Salut

Tu peux essayer ce qui suit. Ce n'est pas trop optimisé mais bon ça fonctionne.

'Code à mettre dans une feuille avec un bouton "Command1"
'un label (label1) et un textbox (text1)
'Mettre le chemin complet du programme à détecter dans le textbox

Private Sub Command1_Click()
DetectApp Text1.Text
End Sub
Public Function DetectApp(NomApp As String) As Boolean

Const PROCESS_ALL_ACCESS = 0
Dim uProcess As PROCESSENTRY32
Dim AppTrouve As Long
Dim hSnapshot As Long
Dim NomExe As String
Dim exitCode As Long
Dim myProcess As Long
Dim NbreApp As Integer
Dim i As Integer
On Local Error GoTo Err
NbreApp = 0

Const TH32CS_SNAPPROCESS As Long = 2&

uProcess.dwSize = Len(uProcess)
hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
AppTrouve = ProcessFirst(hSnapshot, uProcess)

Do While AppTrouve
i = InStr(1, uProcess.szexeFile, Chr(0))
NomExe = LCase$(Left$(uProcess.szexeFile, i - 1))
If Right$(NomExe, Len(NomApp)) = LCase$(NomApp) Then
DetectApp = True
NbreApp = NbreApp + 1
myProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID)
End If
AppTrouve = ProcessNext(hSnapshot, uProcess)
Loop
Label1.Caption = "Cette application n'est pas ouverte" If DetectApp True Then Label1.Caption "Cette application est ouverte"

Err:
End Function

Private Sub Form_Load()
RegisterServiceProcess GetCurrentProcessId, 1
End Sub

Private Sub Form_Unload(Cancel As Integer)
RegisterServiceProcess GetCurrentProcessId, 0
End Sub

****************************************

'Code à mettre dans un module

Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long
Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long

Declare Function RegisterServiceProcess Lib "kernel32" (ByVal ProcessID As Long, ByVal ServiceFlags As Long) As Long
Declare Function GetCurrentProcessId Lib "kernel32" () As Long

Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szexeFile As String * 260
End Type

De plus, si tu veux la liste de toutes les applications ouvertes sur ta machine, tu peux ajouter un listbox
(list1) de la façon suivante :
Ajoute list1.clear après AppTrouve = ProcessFirst(hSnapshot, uProcess)
et list1.additem NomExe après NomExe = LCase$(Left$(uProcess.szexeFile, i - 1))

a+
0
cs_Solo Messages postés 10 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 6 octobre 2004
20 déc. 2001 à 21:57
-------------------------------
Réponse au message :
-------------------------------

Salut

Tu peux essayer ce qui suit. Ce n'est pas trop optimisé mais bon ça fonctionne.....

-------------------------------
Réponse au message :
-------------------------------

Mon programme vb6 lance différentes applications en utilisant shell. Ai-je un moyen de connaître l'état d'une application : ouverte ou fermée ? J'ai cru comprendre qu'il fallait avoir le " handle " de l'application, mais comment le connaitre ?

Merci à celui qui m'aidera.
Gadot

---------------------------------------

Salut... c'est avec beaucoup d'interets que j'ai regardé la réponse a la question.

J'ai moi meme un probleme similaire.
Mon programme doit lancer netscape, pour lequel il faut que je mette en place quelques plugins. le probleme est que si netscape est deja lancé, mes plugins ne sont pas pris en compte...(je ne suis pas l'utilisateur final).
Ce que je voudrais donc faire, c'est savoir si netscape (dont je connait le chemin et le nom de l'exe qui peut etre v4 a v6.2 selon la config de l'uitlisateur) est deja lancé pour eventuellement l'arreter. (ce chemin fait partie de la config de mon programme selon une réponse de l'utilisateur).

l'API CreateToolhelpSnapshot permet de savoir ca...seulement, cette api n'est dispo que depuis W95, et pas sur NT4...verrais tu une autre solution?
Merci

ph.saunier@libertysurf.fr
0
cs_Solo Messages postés 10 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 6 octobre 2004
20 déc. 2001 à 21:59
-------------------------------
Réponse au message :
-------------------------------

Salut

Tu peux essayer ce qui suit. Ce n'est pas trop optimisé mais bon ça fonctionne.....

-------------------------------
Réponse au message :
-------------------------------

Mon programme vb6 lance différentes applications en utilisant shell. Ai-je un moyen de connaître l'état d'une application : ouverte ou fermée ? J'ai cru comprendre qu'il fallait avoir le " handle " de l'application, mais comment le connaitre ?

Merci à celui qui m'aidera.
Gadot

---------------------------------------

Salut... c'est avec beaucoup d'interets que j'ai regardé la réponse a la question.

J'ai moi meme un probleme similaire.
Mon programme doit lancer netscape, pour lequel il faut que je mette en place quelques plugins. le probleme est que si netscape est deja lancé, mes plugins ne sont pas pris en compte...(je ne suis pas l'utilisateur final).
Ce que je voudrais donc faire, c'est savoir si netscape (dont je connait le chemin et le nom de l'exe qui peut etre v4 a v6.2 selon la config de l'uitlisateur) est deja lancé pour eventuellement l'arreter. (ce chemin fait partie de la config de mon programme selon une réponse de l'utilisateur).

l'API CreateToolhelpSnapshot permet de savoir ca...seulement, cette api n'est dispo que depuis W95, et pas sur NT4...verrais tu une autre solution?
Merci

ph.saunier@libertysurf.fr
0
madcow41 Messages postés 54 Date d'inscription vendredi 12 avril 2002 Statut Membre Dernière intervention 11 mars 2008
25 août 2002 à 10:41
Je suppose que ceci est valable quand on connais le Nom de la fenêtre mais moi je ne connais que le Numéro de Process, komenkonfé ?

MaD COw };-)
0
Rejoignez-nous