Ottieni le maniglie delle finestre dell'applicazione
Domanda
Sto costruendo un'app che ha dato a un'altra app mainWindowhandle che raccoglie informazioni sullo stato della finestra. Non ho problemi a raccogliere informazioni sulle finestre secondarie, ma non riesco ad accedere alle altre finestre aperte di un'applicazione o ai menu. Esiste un modo per ottenere tutti gli handle di finestra di un'applicazione?
Soluzione
Potresti fare ciò che Process.MainWindowHandle
sembra: usare P / Invoke per chiamare EnumWindows
, che richiama un metodo di callback per ogni finestra di livello superiore nel sistema.
Nel callback, chiama GetWindowThreadProcessId
, e confronta l'id di processo della finestra con Process.Id
; se gli ID processo corrispondono, aggiungi l'handle della finestra a un elenco.
Altri suggerimenti
Per prima cosa, devi ottenere il manico della finestra 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, puoi usare questo handle per ottenere tutte le finestre dei bambini:
[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;
}