【问题标题】:Unexpected behaviour of Process.MainWindowHandleProcess.MainWindowHandle 的意外行为
【发布时间】:2008-09-07 10:14:23
【问题描述】:

我一直在努力理解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 的值发生变化。

也许我误解了文档。

谁能解释一下?

【问题讨论】:

  • 因为这个错误,我损失了 10 个小时。谢谢女士!

标签: c# .net msdn


【解决方案1】:

@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 代码枚举窗口时,很明显第一个可见窗口(即顶级窗口)将匹配此条件。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2016-07-16
      • 2016-05-10
      • 2020-07-23
      • 2021-08-23
      • 2021-11-16
      • 2017-10-20
      相关资源
      最近更新 更多