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
risposta
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.
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;
}
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
Questo funziona per qualsiasi finestra, anche per Windows non appartenenti alla propria applicazione. Scusa se ho frainteso la tua domanda. – Mez
Da dove viene 'EnumWindowProc'? –
di verificare questa soluzione di lavoro: http://stackoverflow.com/a/28055461/1274092 –