Get Application's Window Handles
Asked Answered
H

3

20

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?

Housebroken answered 4/5, 2009 at 16:54 Comment(1)
Check out this working solution: https://mcmap.net/q/331463/-how-can-i-get-the-child-windows-of-a-window-given-its-hwndFootman
F
17

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.

Fluviomarine answered 4/5, 2009 at 17:1 Comment(0)
A
12

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;  
}   
Aman answered 4/5, 2009 at 17:38 Comment(5)
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 errorNeoterism
M
2
    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

Margarettmargaretta answered 23/11, 2020 at 22:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.