Process.MainWindowHandle的异常行为
时间:2020-03-05 18:48:56 来源:igfitidea点击:
我一直在尝试了解Process.MainWindowHandle。
根据MSDN; "主窗口是启动过程时创建的窗口。初始化后,可能会打开其他窗口,包括Modal和TopLevel窗口,但与该过程关联的第一个窗口仍是主窗口。" (添加了强调)
但是在调试时,我注意到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(); }
当我们(例如)单击VS中的下拉菜单时,可以看到MainWindowHandle的值发生了变化。
MainWindowHandleMystery http://i37.tinypic.com/11ky1yb.jpg
也许我误解了文档。
谁能阐明?
解决方案
回答
实际上,Process.MainWindowHandle是最顶层窗口的句柄,它并不是真正的"主窗口句柄"
回答
@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代码枚举窗口时,很明显第一个可见窗口(即顶级窗口)将符合此条件。