Holen Anwendung Fenstergriffe
Frage
Ich baue eine App, die eine andere App gegeben Mainwindowhandle es Informationen über den Fensterstatus sammelt. Ich habe kein Problem Informationen über Kinder Fenster zu sammeln, aber ich kann nicht die anderen geöffneten Fenster einer Applikation zuzugreifen oder auch die Menüs. Gibt es eine Möglichkeit, alle Fenstergriffe eine Anwendung zu bekommen?
Lösung
Sie tun können, was Process.MainWindowHandle
zu tun scheint: Verwendung P / Invoke der EnumWindows
In Ihrem Rückruf, rufen Sie GetWindowThreadProcessId
, und vergleichen Sie die Prozess-ID des Fensters mit Process.Id
; wenn der Prozess-IDs entspricht, fügen Sie den Fenstergriff auf eine Liste.
Andere Tipps
Als erstes werden Sie die Window der Anwendung des Hauptfensters bekommen.
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
IntPtr hWnd = (IntPtr)FindWindow(windowName, null);
Dann können Sie diesen Griff verwenden, um alle childwindows zu bekommen:
[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;
}