2009-05-06 12 views
6

Ho seguito questo tutorial (c'è un po 'più di quello che è elencato qui perché nel mio codice ottengo una finestra tramite clic del mouse) per afferrare una finestra come bitmap e quindi renderizzare quella bitmap in un finestra diversa.Catturare una finestra che è nascosta o minimizzata

La mia domanda:

Quando quella finestra è ridotto al minimo o nascosto (SW_HIDE) la mia cattura dello schermo non funziona, quindi è possibile catturare una finestra quando viene minimizzato o nascosto?

risposta

5

L'API PrintWindow funziona bene, lo uso per catturare le miniature per le finestre nascoste. Nonostante il nome, è diverso da WM_PRINT e WM_PRINTCLIENT, funziona praticamente con tutte le finestre tranne le finestre Direct X/WPF.

Ho aggiunto del codice (C#) ma dopo aver esaminato come ho usato il codice, mi sono reso conto che la finestra non è effettivamente nascosta quando catturo la sua bitmap, è appena fuori dallo schermo, quindi potrebbe non funzionare per il tuo caso. Potresti mostrare la finestra fuori dallo schermo, fare una stampa e poi nasconderla di nuovo?

 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

Interessante, ho provato ma ho avuto alcun risultato. Puoi pubblicare qualche codice o un link o qualcosa del genere? Grazie – cbrulak

+2

Questo non funziona per finestre minimizzate/nascoste, almeno non nel mio caso. Tuttavia, l'uso di 'PrintWindow' mentre la finestra è fuori dallo schermo è una buona alternativa. –

+0

Ruud, sì, hai ragione, dovrai mostrare la finestra fuori dallo schermo, finestra di stampa, quindi ridurla di nuovo. –

1

Ci sono WM_PRINT e WM_PRINTCLIENT messaggi che è possibile inviare alla finestra, che causano il rendering del contenuto nello HDC di propria scelta.

Tuttavia, questi non sono perfetti: mentre i controlli standard di Win32 gestiscono correttamente, eventuali controlli personalizzati nell'app potrebbero non.

0

sto cercando di ottenere il bitmap di controlli parzialmente nascosti.

Prima ho usato il codice, ma includevo finestre sovrapposte. Quindi .. forse vuoi provare questo. Il WM_PRINTCLIENT dovrebbe (a mio modo di vedere) ridisegnare tutto all'interno del controllo, anche se non è realmente visibile.

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

Il codice precedente è stato commentato ora. È basato sul codice trovato qui: Pocket PC: Draw control to bitmap (risposta accettata). È fondamentalmente lo stesso di Tim Robinson suggerisce in questo thread.

Inoltre, uno sguardo qui http://www.tcx.be/blog/2004/paint-control-onto-graphics/

Problemi correlati