2009-05-06 8 views
6

Seguí esto tutorial (hay un poco más de lo que aquí aparece porque en mi código aparece una ventana con el clic del mouse) para tomar una ventana como mapa de bits y luego renderizar ese mapa de bits en un ventana diferenteCapturando una ventana que está oculta o minimizada

Mi pregunta:

Cuando esa ventana se minimiza o se oculte (SW_HIDE) mi captura de pantalla no funciona, por lo que es posible capturar una ventana cuando se minimiza o se oculta?

Respuesta

5

La api PrintWindow funciona bien, la utilizo para capturar miniaturas de ventanas ocultas. A pesar del nombre, es diferente de WM_PRINT y WM_PRINTCLIENT, funciona con casi todas las ventanas, excepto Windows Direct X/WPF.

Agregué un código (C#) pero después de revisar cómo usé el código, me di cuenta de que la ventana no está realmente oculta cuando capturo su mapa de bits, simplemente fuera de la pantalla por lo que puede no funcionar para su caso. ¿Podrías mostrar la ventana de la pantalla, hacer una impresión y luego volver a ocultarla?

 public static Bitmap PrintWindow(IntPtr hwnd) 
    { 
     RECT rc; 
     WinUserApi.GetWindowRect(hwnd, out rc); 

     Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb); 
     Graphics gfxBmp = Graphics.FromImage(bmp); 
     IntPtr hdcBitmap = gfxBmp.GetHdc(); 
     bool succeeded = WinUserApi.PrintWindow(hwnd, hdcBitmap, 0); 
     gfxBmp.ReleaseHdc(hdcBitmap); 
     if (!succeeded) 
     { 
      gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size)); 
     } 
     IntPtr hRgn = WinGdiApi.CreateRectRgn(0, 0, 0, 0); 
     WinUserApi.GetWindowRgn(hwnd, hRgn); 
     Region region = Region.FromHrgn(hRgn); 
     if (!region.IsEmpty(gfxBmp)) 
     { 
      gfxBmp.ExcludeClip(region); 
      gfxBmp.Clear(Color.Transparent); 
     } 
     gfxBmp.Dispose(); 
     return bmp; 
    } 
+0

interesante, lo he intentado pero me dieron ningún resultado. ¿Puedes publicar algún código o un enlace o algo así? Gracias – cbrulak

+2

Esto no funciona para ventanas minimizadas/ocultas, al menos no en mi caso. Sin embargo, usar 'PrintWindow' mientras la ventana está fuera de pantalla es una buena alternativa. –

+0

Ruud, sí, tienes razón, deberás mostrar la ventana de la pantalla, imprimirla, luego minimizarla nuevamente. –

1

Hay WM_PRINT y WM_PRINTCLIENT mensajes que puede enviar a la ventana, que hacen que sus contenidos se procesen en el HDC de su elección.

Sin embargo, estos no son perfectos: mientras que los controles estándar de Win32 manejan estos correctamente, cualquier control personalizado en la aplicación podría no funcionar.

0

Estoy tratando de obtener el mapa de bits de los controles parcialmente ocultos.

Utilicé el código anterior al dibujo, pero incluía ventanas superpuestas. Entonces ... tal vez quieras probar esto. El WM_PRINTCLIENT debe (a mi entender) volver a dibujar todo dentro del control, incluso si no es realmente visible.

const int WM_PRINT = 0x317, WM_PRINTCLIENT = 0x318, PRF_CLIENT = 4, 
PRF_CHILDREN = 0x10, PRF_NON_CLIENT = 2, 
COMBINED_PRINTFLAGS = PRF_CLIENT | PRF_CHILDREN | PRF_NON_CLIENT; 
SendMessage(handle, WM_PRINTCLIENT, (int)hdc, COMBINED_PRINTFLAGS); 
//GDIStuff.BitBlt(hdc, 0, 0, width, height, hdcControl, 0, 0, (int)GDIStuff.TernaryRasterOperations.SRCCOPY); 

El código anterior está comentado ahora. Se basa en el código que se encuentra aquí: Pocket PC: Draw control to bitmap (respuesta aceptada). Es básicamente lo mismo que Tim Robinson sugiere en este hilo.

También, echar un vistazo aquí http://www.tcx.be/blog/2004/paint-control-onto-graphics/

Cuestiones relacionadas