I'm building an app that given another app mainWindowhandle it collects information about the window state. I have no problem collecting information about child windows, but I can not access the other open windows of an application or even the menus. Is there any way of getting all window handles of an application?
Get Application's Window Handles
Check out this working solution: https://mcmap.net/q/331463/-how-can-i-get-the-child-windows-of-a-window-given-its-hwnd –
Footman
You could do what Process.MainWindowHandle
appears to do: use P/Invoke to call the EnumWindows
function, which invokes a callback method for every top-level window in the system.
In your callback, call GetWindowThreadProcessId
, and compare the window's process id with Process.Id
; if the process ids match, add the window handle to a list.
First, you'll have to get the windowhandle of the application's mainwindow.
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
IntPtr hWnd = (IntPtr)FindWindow(windowName, null);
Then, you can use this handle to get all 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 the problem isn't getting child windows, I can do that easily, what I can't do is get to other windows besides mainWindow and its childs... –
Housebroken
This works for any window, also for windows not belonging to the own application. Sorry if I misunderstood your question. –
Aman
From where comes
EnumWindowProc
? –
Nonfulfillment Add in a declaration for it: private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); –
Neoterism
EnumWindowProc childProc = new EnumWindowProc(EnumWindow); this get an error –
Neoterism
public void GetWindowHandles()
{
List<IntPtr> windowHandles = new List<IntPtr>();
foreach (Process window in Process.GetProcesses())
{
window.Refresh();
if (window.MainWindowHandle != IntPtr.Zero)
{
windowHandles.Add(window.MainWindowHandle);
}
}
}
Read This as to why we call the refresh method and check if the pointer is zero
© 2022 - 2024 — McMap. All rights reserved.