tutorial documentacion development descargar c# .net msdn

documentacion - c# tutorial



Comportamiento inesperado de Process.MainWindowHandle (2)

@edg,

Supongo que es un error en MSDN. Puedes ver claramente en Relfector, esa verificación de "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, la ventana de nivel superior) coincidirá con este criterio.

He estado tratando de entender Process.MainWindowHandle .

De acuerdo con 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 realizaba la depuración noté que MainWindowHandle parecía cambiar el valor ... que 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 el valor de MainWindowHandle cambiando cuando (por ejemplo) haga clic en un menú desplegable dentro de VS.

MainWindowHandleMystery http://i37.tinypic.com/11ky1yb.jpg

Quizás he entendido mal la documentación.

¿Alguien puede arrojar luz?


En realidad Process.MainWindowHandle es un controlador de la ventana más alta, no es realmente el "Identificador de la ventana principal"