Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Process.MainWindowHandle的意外行为_C#_.net_Msdn - Fatal编程技术网

C# Process.MainWindowHandle的意外行为

C# Process.MainWindowHandle的意外行为,c#,.net,msdn,C#,.net,Msdn,我一直在努力理解 根据MSDN;“主窗口是在进程启动时创建的窗口。初始化后,可以打开其他窗口,包括模式窗口和顶层窗口,但与进程关联的第一个窗口仍然是主窗口。”(强调添加) 但在调试时,我注意到MainWindowHandle似乎改变了值。。。这是我没有预料到的,尤其是在查阅了上面的文档之后 为了确认这种行为,我创建了一个独立的WinForms应用程序,它带有一个计时器,每100毫秒检查一次“DEVENV”(Visual Studio)进程的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的值发生变化

也许我误解了文档


有人能解释吗?

实际上是进程。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代码枚举窗口时,很明显第一个可见窗口(即顶级窗口)将符合此标准。

由于此错误,我损失了10个小时。谢谢你,女士!