Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unexpected behaviour of Process.MainWindowHandle

Tags:

c#

.net

msdn

I've been trying to understand Process.MainWindowHandle.

According to MSDN; "The main window is the window that is created when the process is started. After initialization, other windows may be opened, including the Modal and TopLevel windows, but the first window associated with the process remains the main window." (Emphasis added)

But while debugging I noticed that MainWindowHandle seemed to change value... which I wasn't expecting, especially after consulting the documentation above.

To confirm the behaviour I created a standalone WinForms app with a timer to check the MainWindowHandle of the "DEVENV" (Visual Studio) process every 100ms.

Here's the interesting part of this test app...

    IntPtr oldHWnd = IntPtr.Zero;

    void GetMainwindowHandle()
    {
        Process[] processes = Process.GetProcessesByName("DEVENV");

        if (processes.Length!=1)
            return;

        IntPtr newHWnd = processes[0].MainWindowHandle;

        if (newHWnd != oldHWnd)
        {
            oldHWnd = newHWnd;
            textBox1.AppendText(processes[0].MainWindowHandle.ToString("X")+"\r\n");
        }

    }

    private void timer1Tick(object sender, EventArgs e)
    {
        GetMainwindowHandle();
    }

You can see the value of MainWindowHandle changing when you (for example) click on a drop-down menu inside VS.

MainWindowHandleMystery

Perhaps I've misunderstood the documentation.

Can anyone shed light?

like image 415
Ed Guiness Avatar asked Sep 07 '08 10:09

Ed Guiness


1 Answers

@edg,

I guess it's an error in MSDN. You can clearly see in Relfector, that "Main window" check in .NET looks like:

private bool IsMainWindow(IntPtr handle)
{
    return (!(NativeMethods.GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero)  
             && NativeMethods.IsWindowVisible(new HandleRef(this, handle)));
}

When .NET code enumerates windows, it's pretty obvious that first visible window (i.e. top level window) will match this criteria.

like image 85
aku Avatar answered Sep 28 '22 14:09

aku