2012-11-12 19 views
5

Come posso estrarre tutte le finestre figlio di una finestra?Estrai tutte le finestre figlio della finestra

codice di esempio:

Dim hWnd As IntPtr = ProcessName.MainWindowHandle 
For Each hWndChild As IntPtr In hWnd 
    MsgBox(hWndChild.classname.tostring & ", Caption: " & hWndChild.caption.tostring()) 
Next 

(come spia ++)

+5

Utilizzare EnumChildWindows(). –

+0

grazie :) ci proverò. – famf

+0

Windows o controlli? –

risposta

1

Proprio come altri hanno suggerito, è necessario utilizzare i EnumWindows e EnumChildWindows funzioni.

Ecco un link al programma dimostrativo poco ho appena porting da pezzi di codice da un altro programma che avevo scritto in VB6 (molto tempo fa): Windows Scanner

Speranza che aiuta ...


Modifica: Ho appena realizzato che questa non era una grande risposta senza spiegare in realtà come funzionano queste funzioni. Quindi, ecco qui:

La funzione EnumWindows assume come primo parametro un puntatore a una funzione di richiamata. Il secondo parametro è un valore che è possibile passare alla funzione di callback. Puoi considerarlo come un argomento definito dall'utente.

Ogni volta che EnumWindows "trova" una nuova finestra, chiamerà la funzione di richiamata per informare sulla nuova finestra. Questa funzione di callback prende come parametri, il gestore della finestra e il parametro opzionale che l'utente ha specificato quando è stato chiamato per la prima volta EnumWindows.

Quindi, in sostanza, questo è come si chiama EnumWindows:

EnumWindows(New EnumWindowsProc(AddressOf EnumProc), 0) 

Dove EnumWindowsProc è un delegato utilizzato per creare un riferimento alla funzione EnumProc, che sarà il nostro richiamata.

La firma di tale richiamo è la seguente:

Private Function EnumProc(hWnd As IntPtr, lParam As IntPtr) As Boolean 

E 'all'interno di questa funzione che si popola la matrice interna delle finestre scoperti.

Le cose sono praticamente le stesse per la funzione EnumChildWindows, con la sola differenza che il suo primo parametro deve essere il gestore della finestra padre. Tutto il resto viene gestito nello stesso modo.

Se si controlla il codice sorgente del programma WindowsScanner, si vedrà che utilizzo anche lo stesso delegato e la stessa funzione di callback per entrambi EnumWindows e EnumChildWindows. Quindi, come faccio a sapere se stiamo enumerando le finestre di primo livello o secondarie? Semplice, ho semplicemente impostato l'ultimo parametro di EnumChildWindows su "1". Quindi, questo parametro viene passato alla funzione di callback (EnumProc) che consente di eseguire diverse azioni in base al valore di tale parametro.

Problemi correlati