[Func] ProcessGetWin | Tous les processus et leurs fenêtres.

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Dinosaure
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 06 oct. 2011 16:36
Status : Hors ligne

[Func] ProcessGetWin | Tous les processus et leurs fenêtres.

#1

Message par Dinosaure »

Bonjour !
Voici une fonction qui liste les processus ainsi que les fenêtres associées, permettant de retrouver aisément les fenêtres assorties à un processus (par liste de noms ou PIDs).
► Afficher le texte
Fonctionnement :

Code : Tout sélectionner

ProcessGetWin(Mode, "Processus;cherché", "Liste;Des;Fenêtres")
- Retourne un Array (matrice) de largeur 4 et de hauteur minimale 1
- Le paramètre de Mode permet de choisir le type de retour désiré : Par exemple, il est possible de récupérer dans un array 1-based toutes les fenêtres associées à tous les processus sauf ceux indiqués exactement en paramètre 2 (séparés par un point-virgule) en utilisant le mode 64+1024.
- Le paramètre sProcessGet est une chaîne de caractères supposée recevoir la liste des noms ou PIDs des processus à rechercher (suivant le mode black-liste, ils peuvent être ceux à ne pas retourner) séparés par un point-virgule. Notez qu'un point-virgule final ajoute une valeur "vide" supplémentaire.
- Le paramètre sListed est une chaîne de caractère supposée recevoir la liste des noms ou Handles des fenêtres à recherche (suivant le mode black-liste, etc) séparés par un point-virgule. La note ci-dessus s'applique ici aussi.

Utilisation :

Code : Tout sélectionner

#include <Array.au3>
Local $a = ProcessGetWin() ;Par défaut, tous les processus sont retournés assortis de toutes les fenêtres associées
_ArrayDisplay($a)
Voilà, je l'avais présentée dans un fil de discussion précédent, mais elle est étoffée depuis et cela ne concerne pas uniquement la recherche du Handle à partir d'un PID.

Qu'en pensez-vous ?
Il me semble que l'utilisation du Mode est tout de même bien complexe à prendre en main, auriez-vous des propositions pour simplifier cela ?

D.
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 867
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [Func] ProcessGetWin | Tous les processus et leurs fenêt

#2

Message par DimVar »

Bonjour,


Pour ma part, je trouve efficace le gestionnaire de tache pour cela.
Dans l'onglet application, tu trouves ta fenêtre, puis clique droit dessus "aller dans le processus".

Bon courage.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [Func] ProcessGetWin | Tous les processus et leurs fenêt

#3

Message par ZDS »

Bonjour DimVar,

Il s'agit d'une fonction qui permet de s'abstraire du gestionnaire de tâches, et d'en récupérer autant voir plus d'informations pertinentes. Ce que je veux dire par là, c'est que toutes les fonctions AutoIt ont pour vocation de manipuler des données, même si il existe, pour quasiment chacune d'elle, une version à la mano (c'est comme si tu disais pour la FileCopy qu'il suffisait de faire un copier/coller avec l'explorer ^^).

Cette fonction a son utilité car avec les fonctionnalités de bases d'AutoIt il est permis de récupérer les processus à partir des fenêtres et une gymnastique permet l'inverse, cette fonction par exemple, (même si pour ma part, je la trouve un peu lourde en terme d'algo, et utilise des affinements qui ne me servirait pas personnellement).

A bientôt !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 867
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [Func] ProcessGetWin | Tous les processus et leurs fenêt

#4

Message par DimVar »

:oops:
ZDS : Tu dois sans doute avoir raison, mais je pensais bettement que si en 3 click on a l'info (certes avec une souris), peux etre qu'en utilisant la bonne dll, on peut peut etre aussi sortir le resultat (en moins de 100lignes de code).
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Dinosaure
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 06 oct. 2011 16:36
Status : Hors ligne

Re: [Func] ProcessGetWin | Tous les processus et leurs fenêt

#5

Message par Dinosaure »

Euuh, oui, mais euuh, non.
Je plussoie (et remercie ^^) ZDS, car me dire que je peux le faire avec le Taskmanager, c'est comme me dire qu'il est possible d'éteindre son ordinateur en cliquant sur "démarrer > Arrêter".
'fin, ouais, c'est chouette, quoi, mais l'intérêt est plutôt dans la manipulation des données.

Sinon, en terme de DLLs, je veux bien savoir lesquelles te sembleraient pertinentes à utiliser à la place ProcessList(), qui s'occupe de la liste des processus actifs, et WinList(), qui se charge des fenêtres disponibles.

La fonction ne fait que récupérer les fenêtres et les processus demandés (ou ceux justement hors liste noire), donc rien de sorcier.
Et je serais très intéressé pour savoir comment tu trouves les fenêtres rattachées au processus "AutoIt.exe" juste à partir du nom du processus avec la souris ? :)

De toutes façons, mon intérêt est de trier les fenêtres portant un certain nom de processus pour leur affecter une touche de raccourcis, le gestionnaire des tâches ne remplit pas cette fonction; donc tant qu'à faire de l'avoir développée, je la partage.

D.
(Et 115 lignes en comptant les commentaires, quoi... Je ne pensais pas que ça semblerait "long" à quelqu'un, sachant qu'elle est complète. Une fois retirée la gestion des Modes et des conditionnelles d'entrée, on en arrive à ~15 lignes.)
► Afficher le texteCadeau.
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 867
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [Func] ProcessGetWin | Tous les processus et leurs fenêt

#6

Message par DimVar »

@Dinosaure :
Je me rends compte que j'ai du lire ton post trop vite (vouloir aller à l’essentiel) et je n'y ai vu qu'une GUI qui reproduit le gdt de Windows.
D'où l'idée (sans doute erronée), de proposer de manipuler une dll pour obtenir un résultat similaire.
Toujours est il qu'il ne faut voir qu'une maladresse de ma part... :wink:
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Dinosaure
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 06 oct. 2011 16:36
Status : Hors ligne

Re: [Func] ProcessGetWin | Tous les processus et leurs fenêt

#7

Message par Dinosaure »

J'ai aussi eu l'idée de manipuler une DLL pour "simplifier" le script, et la fonction _WinAPI_EnumWindows() (+popup/top) assortie de EnumProcesses() (non-documentée, mais existante dans la liste MSDN et qui devrait théoriquement porter le nom de "_WinAPI_EnumProcesses()") pourraient être envisageables, mais les fonctions ProcessList() et WinList() sont très largement suffisantes pour le niveau d'optimisation dont j'avais besoin.

En revanche, oui, il s'agit d'un degré d'optimisation assez faible, il y a fort à parier que le traitement serait plus précis (et même peut-être plus rapide) en attaquant directement user32.dll et psapi.dll, bien que les 100 lignes risquent d'être boudées avec une telle implémentation. (Je n'ai pas dit qu'un nombre de lignes plus élevé pour la fonction donnerait un code plus lent, au contraire !)

Sinon, plus j'y réfléchis, et plus je trouve que le Mode est mal fichu : il ne sert à rien de mélanger au même endroit la gestion du processus et celui de la fenêtre, donc voici l'en-tête de la fonction (bientôt) revue :

Code : Tout sélectionner

ProcessGetWin($iModeProcessus, $sProcessGet, $iModeWindows, $sWindowsGet)
Plus simple : le iModeProcessus permet de spécifier la façon dont la liste des processus passés en argument est traitée, et le iModeWindows fait la même chose mais en 3ème argument et à destination de la liste des fenêtres.

Il n'y a pas de GUI attachée à la fonction (j'en ai une dans le cadre de mon script, mais qui ne fait que traiter la sortie de cette fonction, donc ça n'a pas d'utilité ici), je me suis certainement mal exprimé pour que cela puisse porter à confusion : il s'agit bien de la fusion de 2 tableaux contenant d'un côté les processus désirés et de l'autre les fenêtres désirées en un tableau de 4 colonnes Nom/PId/Titre/Handle.

Utiliser cette UserDefinedFunction AutoIt en tant que TaskMgr est une possibilité parmis d'autres, tandis que le TaskMgr ne peut pas être utilisé pour manipuler des processus dans un script AutoIt.

Bonne soirée,
D.
Répondre