2011-04-18 9 views
6

¿Por qué obtengo un Altura y Ancho de 0 con el siguiente:¿Por qué obtengo una altura y un ancho de 0?

static void Main(string[] args) 
    { 
     Process notePad = new Process(); 
     notePad.StartInfo.FileName = "notepad.exe"; 
     notePad.Start(); 
     IntPtr handle = notePad.Handle; 

     RECT windowRect = new RECT(); 
     GetWindowRect(handle, ref windowRect); 
     int width = windowRect.Right - windowRect.Left; 
     int height = windowRect.Bottom - windowRect.Top; 

     Console.WriteLine("Height: " + height + ", Width: " + width); 
     Console.ReadLine(); 
    } 

Aquí es mi definición de GetWindowRect:

[DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); 

Esta es mi definición de RECT:

[StructLayout(LayoutKind.Sequential)] 
    public struct RECT 
    { 
     public int Left;  // x position of upper-left corner 
     public int Top;   // y position of upper-left corner 
     public int Right;  // x position of lower-right corner 
     public int Bottom;  // y position of lower-right corner 
    } 

Gracias a todos por cualquier ayuda.

+1

¿cómo definió RECT? –

+2

Sospecho que es una carrera: intente agregar unos segundos para dormir después de la línea de Inicio() para que el bloc de notas se ponga en funcionamiento. No estoy seguro de cómo esperar esto programáticamente. – Rup

+0

Además, ¿cuál es el valor devuelto por GetWindowRect? –

Respuesta

9

Está pasando un identificador de proceso a una función, GetWindowRect, que espera un identificador de ventana. Naturalmente, esto falla. Debería enviar Notepad.MainWindowHandle en su lugar.

+0

¡Maldición! Tienes razón, eso funciona. Pensé que MainWindowHandle me iba a dar la ventana de cmd, ¿pero en realidad es la ventana de notePad que se genera? Esto funcionó en combo con la respuesta de JSBangs. – Kay

+3

@Kay El identificador de proceso es algo completamente diferente de un identificador de ventana. Es solo que en .net, con su P/Invoke, pierde seguridad de tipo. En el código win32 simple, se obtendría un error de compilación al intentar mezclar identificadores de procesos y manejadores de ventanas. –

+0

gracias por esa explicación, ¡he estado mezclando los dos! – Kay

1

Me gusta usar pinvoke.net para sanity comprobar todas mis PInvokes. GetWindowRect se describe bien en: http://pinvoke.net/default.aspx/user32/GetWindowRect.html

+0

Esto es lo que estoy usando en realidad y todavía no puedo hacer que funcione. ¡Dios mío, soy un completo novato! – Kay

+0

¿Se está volviendo cierto como el retorno de GetWindowRect? Si no, tiene un error: http://msdn.microsoft.com/en-us/library/ms633519(v=vs.85).aspx – mcw0933

5

Puede que esté consultando el tamaño antes de que el Bloc de notas se haya iniciado completamente. Prueba esto:

notePad.Start(); 
    notePad.WaitForInputIdle(); // Waits for notepad to finish startup 
    IntPtr handle = notePad.Handle; 
+0

Lo intenté, pero no hizo la diferencia, lamentablemente. Pero funcionó en combinación con la respuesta de David. – Kay

Cuestiones relacionadas