Numeros de PID / Taches pour les pro...

J

Jef

Guest
Salut le forum,

j'aimerais s'avoir s'il est possible de recuperer le numero de PID d'une application ouverte sous windows ?

PID : nombre aleatoire attribuer par windows a une tache.

Merci a ceux ou celles qui pouront m'aider...

Jef
 
A

Abel

Guest
Bonjour Jef,

Je ne suis pas pro.
Je me risque donc à une réponse ...

Je suppose que tu veux parler du PID que l'on voit dans le gestionnaire des tâches. C'est à dire l'identificateur de processus.

Je ne suis pas sûr qu'il existe dans VBA un équivalent à GetCurrentProcessId de VB.

Peut être serais-je contredit ?


Abel.
 
J

jmps

Guest
Bonjour Jef, Bonjour Abel,

Désolé Abel ceci est une demi-contradiction. J'ai trouvé ça dans l'aide VBA :

Lance un programme exécutable et renvoie une valeur de type Variant (Double) représentant l'identificateur (ID) de la tâche exécutée en cas de succès, ou un zéro en cas d'échec.

Syntaxe

Shell(pathname[,windowstyle])

La syntaxe de la fonction Shell comprend les arguments nommés suivants :

Élément Description
pathname De type Variant (String). Nom du programme à exécuter, ainsi que tous les arguments ou paramètres de ligne de commande ; peut également préciser le répertoire ou dossier et le lecteur.
windowstyle Facultatif. De type Variant (Integer) correspondant au style de la fenêtre dans laquelle le programme est exécuté. En cas d'omission de windowstyle, le programme est activé mais la fenêtre est réduite.


Si tu veux plus d'infos, tape shell dans l'éditeur vba, place le curseur dessus et appuye sur F1.

Pour en revenir à ta question Jef, on peut donc récupérer le PID de la tâche mais seulement si elle a été lancée à partir d'une macro dans Excel. Les tâches lancées directement sous windows ne sont pas vues par Excel. Du moins c'est ce que je comprends.
Par exemple :
MonPID = Shell("C:\Windows\calc.exe", vbNormalFocus) t'ouvre la calculette et récupère son PID dans la variable MonPID. Par contre je ne sais pas si ce PID est le même que celui vu par Windows bien qu'il y ait des chances.

J'espère que cela te sera utile.
Bon après-midi.

José
 
J

Jef

Guest
Salut a tous

Si on lance un programme avec le shell on obtient en effet un PID qui est le meme que celui de windows. ce n'est malheureusement pas ce que je cherche ...
snif...


merci quand meme a vous deux...

Jef
 
J

jmps

Guest
Alors regarde du côté de AppActivate qui permet de "réactiver" une application (De lui donner le focus en tous cas) à l'aide de son nom. Par exemple : AppActivate "Microsoft Word"
Car je suppose que si tu veux envoyer des ordres (des SendKeys sans doute ?), tu sais à quelle application tu dois t'adresser. Autrement le PID de windows ne te dira pas de quelle appli il s'agit. Je me trompe ?

A+

José
 
J

jmps

Guest
Ce n'est pas important Jef, regarde ce que dit l'aide :

L'instruction AppActivate rend active l'application ou la fenêtre nommée, mais ne l'agrandit ni ne la réduit. La fenêtre d'application cesse d'être active dès que l'utilisateur exécute une action qui entraîne la fermeture de la fenêtre ou l'activation d'une autre. Utilisez la fonction Shell pour démarrer une application et définir le style de la fenêtre.
Pour rechercher l'application à activer, les chaînes de titre de toutes les applications sont comparées avec celle de l'argument title. Si aucun titre ne correspond exactement à l'argument, une application dont le titre commence par la valeur de l'argument title est activée. Si plusieurs applications ont pour nom l'argument title, l'une d'entre elles est activée arbitrairement.


Donc si "Microsoft Word - Mon document" est ouvert, AppActivate "Microsoft Word" tout court trouvera Word. Evidemment, ne sachant pas ce que tu veux faire exactement, je ne peux pas t'aider plus. Tu peux avoir plusieurs Word ouverts avec plusieurs fichiers. Mais dans ce cas PID ou pas, je ne sais pas comment tu feras. Ou plutôt si, le PID te permettrait de les distinguer. C'est ça ton idée ?

A+

José
 
J

Jef

Guest
En fait je veux piloter winamp
dans le gestionnaire des taches il s'appele somplement winamp.exe
mais dans la barre des tache c'est "Numeros.Chanteur.titre - Winamp"

ne pouvant pas connaitre le titre a l'avance je suis coincé...
et AppActivate "Wimamp.exe" ne donne rien...

A+ jef
 
J

jmps

Guest
Il me semblait bien avoir vu passer un fil parlant de winamp dernièrement et tu étais dessus je crois. Bon, ici j'ai pas winamp mais je tâcherai de regarder ça ce soir si je trouve une idée.

Mais question bête... Pourquoi ne lances-tu pas winamp à partir d'excel pour avoir son PID ?

A+

José
 
J

Jef

Guest
en effet j'avais repondu a un besoin de "piloter" winamp avec excel, mais depuis j'ai ammeliorer ma macro et duppliquer sous word, donc si je le lance depuis word, je ne peu plus le piloter avec excel... et vice versa

de plus pouvoir recuperer le PID d'une appli m'interresse pour un autre projet.

je te remerci quand meme du temps que tu as passé avec moi

A+
jef
 
J

jmps

Guest
Bonsoir Jef,

Je ne vois pas bien l'intérêt de piloter une appli (Winamp ou autre) à partir de plusieurs autres (Word + Excel). C'est source de confusion et de conflits entre applis. Mais bon, si tu y tiens, le client est roi après tout. Lol !

Qelques pistes auxquelles je pense, mais dont je ne maîtrise pas la technique :

* Utiliser les variables d'environnement du système (Environ et Environ$, regarde dans l'aide). Mais apparemment dans Excel c'est en lecture seule (A confirmer quand même).
* Utiliser un fichier texte commun qui contiendrait le n° de PID désiré indiqué par l'appli "lanceuse".
* Utiliser les API ? Là, il faudrait un spécialiste, ce que je ne suis pas.
* Peut-être d'autres idées...

En tous cas, bon courage et bonne soirée.

José
 
M

michel

Guest
bonsoir Jef , Abel et josé

la procédure ci-dessous boucle sur toutes les taches actives .
le ProcessID s'affiche à l'écran si une fenetre contient le mot "Winamp"

comme je n'ai pas Winamp d'installé , pour les essais j'ai créé un document "bidon" dont le nom contenait le mot Winamp
je ne peux pas faire de tests plus poussés , mais il est peut etre possible de recuperer directement le titre de la fenetre lors de sa creation , pour eviter de boucler sur toutes les taches actives
testé avec Excel2002 et WinXP



Private Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" _
Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" _
(ByVal hwnd As Long, lpdwProcessId As Long) As Long

Sub processID_FenetreSpecifique()
'adapté d'une procedure de Benoit Marchand
Dim CurrWnd As Long, Length As Long, ProcessId As Long
Dim TaskName As String
Dim Parent As Long, hwnd As Long, Valeur As Long

hwnd = FindWindow("Shell_traywnd", vbNullString)
CurrWnd = GetWindow(hwnd, 0)

While CurrWnd <> 0
Length = GetWindowTextLength(CurrWnd)
TaskName = Space$(Length + 1)
Length = GetWindowText(CurrWnd, TaskName, Length + 1)
TaskName = Left$(TaskName, Len(TaskName) - 1)

'verifie si la fenetre testée contient le mot winamp
If InStr(1, TaskName, "Winamp", vbTextCompare) > 0 Then

Valeur = GetWindowThreadProcessId(CurrWnd, ProcessId)
MsgBox "le PID de la fenetre " & TaskName & " est : " & Valeur
Exit Sub

End If

CurrWnd = GetWindow(CurrWnd, 2)
DoEvents

Wend
MsgBox "fenetre non trouvée . "
End Sub


bonne soirée
MichelXld
 

Discussions similaires

Statistiques des forums

Discussions
312 036
Messages
2 084 812
Membres
102 676
dernier inscrit
LN6