题
我一直试图理解 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();
}
当您(例如)单击 VS 内的下拉菜单时,您可以看到 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 代码枚举窗口时,很明显第一个可见窗口(即顶级窗口)将符合此条件。
其他提示
实际上 Process.MainWindowHandle 是最顶层窗口的句柄,它并不是真正的“主窗口句柄”
不隶属于 StackOverflow