Pregunta

He estado tratando de entender Proceso.MainWindowHandle.

Según MSDN;"La ventana principal es la ventana que se crea cuando se inicia el proceso.Después de la inicialización, se pueden abrir otras ventanas, incluidas las ventanas Modal y TopLevel, pero la primera ventana asociada con el proceso sigue siendo la ventana principal." (Énfasis añadido)

Pero mientras depuraba noté que MainWindowHandle parecía cambiar de valor...lo cual no esperaba, especialmente después de consultar la documentación anterior.

Para confirmar el comportamiento, creé una aplicación WinForms independiente con un temporizador para verificar el MainWindowHandle del proceso "DEVENV" (Visual Studio) cada 100 ms.

Aquí está la parte interesante de esta aplicación de prueba...

    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();
    }

Puede ver que el valor de MainWindowHandle cambia cuando (por ejemplo) hace clic en un menú desplegable dentro de VS.

MainWindowHandleMystery

Quizás he entendido mal la documentación.

¿Alguien puede arrojar luz?

¿Fue útil?

Solución

@edg,

Supongo que es un error en MSDN.Puede ver claramente en Relfector que la verificación de la "Ventana principal" en .NET se ve así:

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

Cuando el código .NET enumera ventanas, es bastante obvio que la primera ventana visible (es decir,ventana de nivel superior) coincidirá con este criterio.

Otros consejos

En realidad, Process.MainWindowHandle es un identificador de la ventana superior, en realidad no es el "identificador de la ventana principal".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top