Using Microsoft Spy++, I can see that the following windows that belong to a process:
Process XYZ window handles, displayed in tree form just like Spy++ gives me:
A
B
C
D
E
F
G
H
I
J
K
I can get the process, and the MainWindowHandle property points to the handle for window F. If I enumerate the child windows using I can get a list of window handles for G through K, but I can't figure out how to find the window handles for A through D. How can I enumerate windows that are not children of the handle specified by MainWindowHandle of the Process object?
To enumerate I'm using the win32 call:
[System.Runtime.InteropServices.DllImport(strUSER32DLL)]
public static extern int EnumChildWindows(IntPtr hWnd, WindowCallBack pEnumWindowCallback, int iLParam);
Pass
IntPtr.Zero
ashWnd
to get every root window handle in the system.You can then check the windows' owner process by calling
GetWindowThreadProcessId
.For everyone still wondering, this is the answer:
for WindowsInterop:
for WindowsInterop.User32:
Now one can simply get every root window by GetRootWindowsOfProcess, and their children by GetChildWindows.
You can use
EnumWindows
to get every top-level window, and then filter the results based onGetWindowThreadProcessId
.