Newsgroup: it.comp.programmare.win32
Titolo: Enumerare le finestre in stile Spy++

Ciao a tutti, la situazione e' questa:
Tramite la funzione EnumWindows enumero tutte le finestre presenti del
sistema, ora vorrei riempire un TreeView con la gerarchia di finestre
un po come fa Spy++, ovvero inserendo al primo livello le finestre
parent ed ai livelli inferiori le varie finestre child...
vorrei anche trovare e mostrare l'icona associata alla finestra
principale di ogni applicazione, un po come fa il task manager di
Windows NT/2000
Una volta che ho l'elenco di tutte le finestre, come faccio a capire
quali sono i loro legami gerarchici? Ho provato a controllare
parent/owner ma non sembra cosi' ovvio...
come faccio a reperire la suddetta icona?
grazie, buon lavoro, Davide.

parent/owner ma non sembra cosi' ovvio...
C'e' un articolo, su MSDN, che illustra la situazione precisa.
Si intitola "Win32 Window Hierarchy and Styles".
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>

Grazie mille, per quanto riguarda l'icona, ho pensato di fare cosi':
Determino il nome dell'eseguibile associato alla finestra top level e
ne estraggo l'icona in posizione 0.
In linea teorica si puo' fare, pero' non e' detto che l'applicazione
usi proprio l'icona in posizione 0, al limite mostro un'icona che pur
essendo contenuta nell'eseguibile, non corrisponde a quella usata
normalmente per l'applicazione.
Ora le domande sono:
Per enumerare gli eseguibili lanciati forse e' meglio usare una
EnumProcess piuttosto che EnumWindows, ma a quel punto come ottengo la
Top Level Window di un processo?
Come determino il file eseguibile associato ad un processo / Top Level
Window ?
Davide.

 non so, pero', come recuperare l'icona (ci devo >pensare).
Dirņ senz'altro una cagata, ma se hai l'handle della window, non puoi usare
GetClassLong (hWnd,GCL_HICON)? Per quanto ne so io, sia gli handle di
finestra, sia quelli di icona sono system-wide. Sennņ puoi risalire al nome
dell'eseguibile, e estrarne (incrociando le dita...) la prima icona delle
risorse.
Ciao,
Zello
[...]

Window ?
Date le considerazioni fatte sopra, devi scorrere la lista delle
finestre.
Risali al PID con GetWindowThreadProcessId.
Dalla lista dei processi ottenuta con EnumProcesses (o
Process32First/Process32Next del ToolHelp) confronti i PID e associ il
nome del processo con la finestra.


risorse.
Non va bene (vedi altro msg).


Bada che e' un concetto diverso da *form* principale, difatti Delphi
Scusa, pensavo stessimo discutendo su it.comp.lang.delphi :)


non so, pero', come recuperare l'icona (ci devo pensare).
WM_GETICON, mi pare

WM_GETICON, mi pare
http://msdn.microsoft.com/library/psdk/winui/windows_14xa.htm


Dunque, alla fine mi sono accorto che la classe CWnd (MFC), ha la
funzione membro GetIcon che effettua la gestione del messaggio
WM_GETICON.
Mi sono accorto che alcuni programmi, tra cui Word, OutLook e Visio,
non restituiscono l'icona con un semplice WM_GETICON per cui ho usato
la funzione GetClassLong passando l'handle della window ed il flag
GCL_HICONSM.
Adesso sembra andare tutto abbastanza bene.
Visto che stiamo parlando di icone avrei un'altra domanda.
Utilizzando la funzione SHGetFileInfo, ottengo l'handle dell'icona
associata ad un determinato file, ma ottengo anche l'index di detta
icona nella system image list. La domanda e', come faccio ad usare la
system image list?
Non l'ho mai usata, ma mi sembra di capire si tratti di un'image list
globale di sistema, se potessi usarla associandola al mio CListCtrl,
non dovrei gestire una mia ImageList nella quale inserire le icone di
volta in volta... visto che la mia applicazione popola un TreeView con
TUTTI i files presenti nel sistema e relativa icona, magari
risparmierei un po di tempo/risorse (non che il tempo non sia una
risorsa importante! ;-)
Grazie, ciao e buon lavoro, Davide.

 Grazie, ciao e buon lavoro, Davide.
Non so, anzi, sarei curioso di saperlo.
L'SDK dice che SHGetFileInfo - con SHGFI_ICON - ritorna l'handle alla system
image list. Ho provato ad usarla come una normale image list, e il risultato
è stato un fiume di Access Violation.
Casualmente, ho trovato - a piè di pagina del metodo GetIconOf
dell'interfaccia IShellIcon - la seguente nota:
"
Notes to Callers
The indexes returned are from the system image list.
Notes to Implementors
This method cannot be implemented external to the shell itself.
"
Mi viene il dubbio che la system image list si possa usare solo da oggetto
COM instanziati da dentro il processo di Explorer, come delle namespace
extensions o delle shell extensions.
Se qualcuno ha un'idea diversa si faccia avanti.
Saluti
Zello