[R] Récupérer les chemins des icones des fenêtres

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
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

[R] Récupérer les chemins des icones des fenêtres

#1

Message par ZDS »

Bonjour à tous !

Toujours dans la lignée des demandes débiles compliquées, je cherche à récupérer pour chaque fenêtre à l'écran le chemin de son icone pour la réutiliser dans un script à part (sousmenu déroulant par exemple, même si je pense plus à une GUI compacte pleine de GUICtrlCreateButton avec le flag $BS_ICON/0x0040).
Dans MSDN source intarissable de bon tuyaux, je n'ai pas trouvé ce que je veux : https://msdn.microsoft.com/en-us/library/windows/desktop/ff468921(v=vs.85).aspx
Comme vous le voyez, pour SETTEXT il y a GETTEXT, pour SETFONT il y a GETFONT, mais pour SETICON il y a macache ^^

Vous auriez des idées? Avoir un WinGetIcon qui soit le pendant du [WinSetIcon de Mikell] serait le top !

Merci d'avance !

PS: Mon but entre autre est d'avoir un petit widget de l'aspect que je souhaite qui listerait les fenêtres à l'écran, ou plutôt aux écrans, et que je ferai apparaître sur mes moniteurs n'ayant pas la barre des tâches (les logiciels comme Multimon Taskbar et équivalent que j'ai pu tester ne sont soit pas stables soit pas customisables soit pas gratuits ^^ - Win 7 Pro 64 avec trois écrans).
Modifié en dernier par ZDS le ven. 26 juin 2015 02:26, modifié 1 fois.
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
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#2

Message par jguinch »

Hello
- Avec _WinAPI_GetClassLongEx, tu peux récupérer le handle de l'icône utilisée par une fenêtre donnée
- Avec _WinAPI_CopyIcon, tu peux copier l'icône (handle précédemment récupéré) pour éviter de la perdre si la fenêtre se ferme
- Avec GUICtrlSendMsg, tu peux appliquer une icône ou image à un contrôle

Ca peut te donner un truc dans ce genre :
► Afficher le texte
Intéressant comme exercice :D
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1038
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#3

Message par walkson »

Bonjour,
Une autre méthode certainement plus longe que celle de jguinch, il y a _WinAPI_ShellExtractIcon mais qui oblige à un chemin
► Afficher le texte
A tout hasard ?...
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#4

Message par jguinch »

La différence est que _WinAPI_GetClassLongEx va récupérer le handle de l'icône affichée, alors que _WinAPI_ShellExtractIcon va piocher l'icône dans l'exécutable de l'application.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#5

Message par mikell »

Hmm j'avais abandonné cette piste parce que ça ne marche pas sous XP ...
[Mode Anticipation /ON]
En prévision des inévitables sarcasmes jguinchesques je précise que WinSetIcon fonctionne elle sous tous les OS Windows :mrgreen:
[Mode Anticipation /OFF]

Edit
Testé sur w7 x64 du boulot, ça marche mais ça ne récupère pas l'icone présente actuellement dans le titre de la fenêtre, par exemple après exécution de l'exemple de WinSetIcon sur 'AutoIt Help' ça récupère l'icone initiale (hh.exe)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1038
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#6

Message par walkson »

Va falloir lancer une souscription pour Mikell :mrgreen:
Image
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#7

Message par mikell »

C'est malin :mrgreen:

@ZDS
► Afficher le texte
:wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
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: [..] Récupérer les chemins des icones des fenêtres

#8

Message par ZDS »

Merci pour votre aide, mais je n'arrive toujours pas à obtenir ce que je souhaite. L'icone récupérée ne m'a pas l'air utilisable :
► Afficher le texteCode
Ci joint l'icone que j'utilise pour mon test

PS: C'est quand même bizarre que les fichiers .ico ne soient pas dans la liste des extensions autorisées sur le forum ^^
Fichiers joints
Icone.zip
(47.12 Kio) Téléchargé 237 fois
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
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#9

Message par mikell »

:shock:
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
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: [..] Récupérer les chemins des icones des fenêtres

#10

Message par ZDS »

Désolé non, ça ne marche toujours pas ^^ En utilisant ta propre version corrigée (pour éviter la pixelisation), la fonction WinSetIcon fonctionne uniquement avec le chemin, mais pas en utilisant le résultat en sortie du WinGetIcon (cf code en pièce jointe). J'ai aussi essayé avec une conversion en int avant de faire appel au _SendMessage, sans plus de succès.
WinGetIcon.zip
(14.01 Kio) Téléchargé 229 fois
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
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#11

Message par jguinch »

Et si tu mets 1 dans _SendMessage au lien de 0 dans WinSetIcon ?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#12

Message par mikell »

Hum chez moi mon code marche (et le tien aussi) à condition de commenter le _WinAPI_DestroyIcon($icon) dans WinSetIcon
Arriver à récupérer une adresse ne veut pas dire arriver à récupérer le contenu s'il a été détruit
Pour tester, avec la ligne en question commentée ou pas :

Code : Tout sélectionner

Local $icone = WinGetIcon($GUI1)
$a = _WinAPI_GetIconInfo($icone)
If not @error Then 
   msgbox(0,"", $a[1])
Else
   msgbox(0,"", "error")
EndIf
GetIconInfoEx serait plus sympa mais je n'ai que XP :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#13

Message par jguinch »

@Mikell : à ce sujet, dans ton premier message, tu dis que ce n'est pas compatible XP. Mais d'après MSDN, les fonctions que j'ai utilisées sont compatibles à partir de Windows 2000. Ou alors j'ai pas compris (très possible :roll: )
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#14

Message par mikell »

Non non tu as raison, c'est moi qui m'ai mal esprimé :mrgreen:
Ce qui ne marche pas sur XP c'est le BM_SETIMAGE (et le _WinAPI_GetClassLongEx ne récupère pas l'icone de la fenêtre affichée)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#15

Message par jguinch »

OK. Là j'ai comprendu... :wink:
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
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: [..] Récupérer les chemins des icones des fenêtres

#16

Message par ZDS »

Re bonjour/soir,

Si je pouvais j'aurais aimé avoir l'icone en mémoire dans le script plutot qu'une simple adresse car comme dit précédemment, avoir l'adresse ne garantie pas de la récupérer : pour peu que la fenêtre soit fermée, on ne peut plus avoir l'icone (dans un historique par exemple).

Mais j'ai une autre utilisation prévue pour cette fonction, liée à WinSetIcon de Mikell : pouvoir faire un WinSetState(@SW_HIDE) puis WinSetState(@SW_SHOW), très utile pour réordonner des fenêtres (au sein d'un même groupe).Le souci qui se pose, c'est qu'en faisant WinSetIcon, l'icone est nickel (aucune pixelisation), mais dès qu'on fait WinSetState(@SW_HIDE -> @SW_SHOW), l'icone est pixelisée.

L'idéal serait donc de pouvoir récupérer SOIT le chemin de l'icone pour pouvoir refaire un WinSetIcon juste après le WinSetState(@SW_HIDE -> @SW_SHOW) SOIT récupérer l'icone complète pour la copier et la réappliquer après.

Le problème de Windows XP est que ton icone ne se pixelise pas, donc tu ne peux pas voir le bug dont je parle ^^ (les icones de ta barre de taches etant en 16x16 et non en 32x32)

Merci d'avance !

EDIT: _WinAPI_GetIconInfoEx retourne une erreur (10) sur une fenêtre affectée par WinSetIcon.
Modifié en dernier par ZDS le sam. 25 avr. 2015 13:14, modifié 1 fois.
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
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupérer les chemins des icones des fenêtres

#17

Message par mikell »

Oui c'est aussi pour ça que je parlais de _WinAPI_GetIconInfoEx (que je ne peux pas tester) à utiliser par exemple juste après le WinGetIcon
Les infos qui t'intéressent devraient en principe se trouver dans les éléments 6 / 7 de l'array résultat
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
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: [..] Récupérer les chemins des icones des fenêtres

#18

Message par ZDS »

Solution de contournement : Vu que l'icone qui m’intéresse est celle appliquée par WinSetIcon et non celle de base (car je cherche à pouvoir avoir une icone personnalisée pour chaque fenêtre non-AutoIt et pouvoir trier la liste de ces fenêtres), est-il possible d'appliquer une sorte de tag à une fenêtre particulière? Une sorte de postit invisible à l'écran basé sur le handle, qui serait détruit en même temps que la fenêtre, et dans lequel j'écrirais le chemin de l'icone customisée.

Ma solution actuellement envisagée est d'utiliser un fichier INI dont la clef est le handle, et dont la valeur est le chemin de l'icone appliquée. Pas des plus propres, mais je n'aurai à modifier que le WinSetIcon de Mikell pour y inclure le chemin, le WinGetIcon ne faisant que lire la valeur dans le fichier en question (avec un sémaphore autour des opérations en question car plusieurs scripts peuvent toucher aux icônes en même temps). Cela demande de mettre en place un garbage collector, car les handles des fenêtres fermées risquent d'être conservés dans le fichier INI et de grossir la liste.

Le tag serait plus pratique (car pas besoin de "garbage collector"), quelqu'un aurait une idée ou saurait si c'est humainement possible?
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
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: [..] Récupérer les chemins des icones des fenêtres

#19

Message par ZDS »

Un peu tardif mais bon : je m'en suis sorti avec une solution qui ne me plait que partiellement. Déjà parce qu'elle m'oblige à utiliser un fichier temporaire pour pouvoir évoluer vers un semblant d'utilisation entre plusieurs processus, et surtout parce que je ne l'ai pas améliorée pour l'instant en vue de l'inter processus justement.

Bref, à vous de voir si ça peut vous être utile, merci encore ! Problème [R]ésolu.
► Afficher le texteAffectation des icones et récupération du handle d'une icone affectée
PS: Pour le moment ce sont les handles qui sont stockés dans le fichier INI, au final il faudra que ce soit le chemin de l'icone (unifié, pour éviter les soucis de majuscules ou de chemin relatif) pour que chaque processus puisse retrouver la nouvelle icone d'une fenêtre donnée. Le tableau $WINICONS servira ensuite dans l'autre sens, comparer la valeur à $WINICONS[$i][0] et utiliser _SendMessage($handle, 0x0080, 1, WINICONS[$i][1]) ; $WM_SETICON = 0x0080
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 !
Répondre