2009-05-04 6 views
13

Sto costruendo un'app che ha ricevuto un'altra app mainWindowhandle che raccoglie informazioni sullo stato della finestra. Non ho problemi a raccogliere informazioni su Windows figlio, ma non riesco ad accedere alle altre finestre aperte di un'applicazione o persino ai menu. C'è un modo per ottenere tutti gli handle di finestra di un'applicazione?Ottieni le maniglie delle finestre dell'applicazione

+0

di verificare questa soluzione di lavoro: http://stackoverflow.com/a/28055461/1274092 –

risposta

15

Si potrebbe fare ciò che sembra fare Process.MainWindowHandle: utilizzare P/Invoke per chiamare la funzione EnumWindows, che richiama un metodo di richiamata per ogni finestra di livello superiore nel sistema.

Nella richiamata, chiamare GetWindowThreadProcessId e confrontare l'id di processo della finestra con Process.Id; se gli ID di processo corrispondono, aggiungi l'handle di finestra a un elenco.

8

Prima di tutto, è necessario ottenere il windowhandle della finestra principale dell'applicazione.

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

IntPtr hWnd = (IntPtr)FindWindow(windowName, null); 

Quindi, è possibile utilizzare questo handle per ottenere tutti childwindows:

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); 

private List<IntPtr> GetChildWindows(IntPtr parent) 
{ 
    List<IntPtr> result = new List<IntPtr>(); 
    GCHandle listHandle = GCHandle.Alloc(result); 
    try 
    { 
     EnumWindowProc childProc = new EnumWindowProc(EnumWindow); 
     EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle)); 
    } 
    finally 
    { 
     if (listHandle.IsAllocated) 
       listHandle.Free(); 
    } 
    return result; 
} 
+0

Mez il problema isn' t ottenere finestre figlio, posso farlo facilmente, quello che non posso fare è arrivare ad altre finestre oltre a mainWindow e ai suoi figli ... – user361526

+0

Questo funziona per qualsiasi finestra, anche per Windows non appartenenti alla propria applicazione. Scusa se ho frainteso la tua domanda. – Mez

+0

Da dove viene 'EnumWindowProc'? –