Process.MainWindowHandle的行为出现了意外情况

10

我一直在尝试理解 Process.MainWindowHandle

根据MSDN的说法,“主窗口是在启动进程时创建的窗口。初始化后,可能会打开其他窗口,包括模态和顶级窗口,但与进程关联的第一个窗口仍然是主窗口。”(强调添加)

但在调试过程中,我发现MainWindowHandle似乎会改变其值......这让我感到意外,特别是在查阅上述文档后。

为了确认行为,我创建了一个独立的WinForms应用程序,并使用定时器每100毫秒检查“DEVENV”(Visual Studio)进程的MainWindowHandle。

以下是此测试应用程序的有趣部分...

    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();
    }

当您在 Visual Studio 中点击下拉菜单时,可以看到 MainWindowHandle 的值发生了变化。

MainWindowHandleMystery

也许我误解了文档。

有人能够解释一下吗?


我因为这个bug浪费了10个小时。谢谢微软! - Maxence
2个回答

11

@edg,

我猜这是MSDN上的一个错误。你可以在反射器中清楚地看到,在.NET中,“主窗口”检查的代码如下:

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

当.NET代码枚举窗口时,很明显第一个可见窗口(即顶级窗口)将符合此条件。


5

实际上,Process.MainWindowHandle是最顶层窗口的句柄,它并不是真正的“主窗口句柄”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接