Get Application's Window Handles

前端 未结 3 1363
野趣味
野趣味 2020-11-28 10:14

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, bu

相关标签:
3条回答
  • 2020-11-28 10:36

    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;  
    }   
    
    0 讨论(0)
  • 2020-11-28 10:49
        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

    0 讨论(0)
  • 2020-11-28 10:56

    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.

    0 讨论(0)
提交回复
热议问题