Process.MainWindowHandle的意外行为

我一直在努力了解Process.MainWindowHandle 。

根据MSDN; “主窗口是在进程启动时创建的窗口。初始化后,可以打开其他窗口,包括Modal和TopLevel窗口,但与进程关联的第一个窗口仍然是主窗口 。” (重点补充)

但是在调试时我注意到MainWindowHandle似乎改变了价值……这是我没想到的,特别是在查阅上面的文档之后。

为了确认行为,我创建了一个带有计时器的独立WinForms应用程序,每隔100ms检查一次“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(); } 

当您(例如)单击VS内的下拉菜单时,您可以看到MainWindowHandle的值发生了变化。

MainWindowHandleMystery http://sofzh.miximages.com/c%23/11ky1yb.png

也许我误解了文档。

谁能摆脱光明?

@edg,

我想这是MSDN中的一个错误。 您可以在Relfector中清楚地看到.NET中的“主窗口”检查如下所示:

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

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

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