2009-05-06 26 views
6

Bunu izledikten sonra tutorial (burada listelenenden biraz daha fazlası var; çünkü kodumda bir pencereyi fare tıklamasıyla bir pencere alıyorum) bir pencereyi bitmap olarak kapmak ve ardından bu bitmapi farklı pencereGizlenen veya en aza indirgenmiş bir Pencereyi Yakalama

Sorum: bu pencere minimize veya gizli edildiğinde

(SW_HIDE) benim ekran yakalama çalışmıyor, bu yüzden minimize veya gizli olduğunda bir pencere yakalamak mümkün mü?

cevap

5

PrintWindow api iyi çalışıyor, gizli pencereler için küçük resimleri yakalamak için kullanıyorum. Adına rağmen, WM_PRINT ve WM_PRINTCLIENT'den farklıdır, Direct X/WPF pencereleri haricinde hemen hemen her pencerede çalışır.

Bazı kodları (C#) ekledim, ancak kodu nasıl kullandığımı inceledikten sonra, bitmapini yakaladığımda pencerenin aslında gizlenmediğini fark ettim, onun ekranı kapalı olduğundan bu durum sizin durumunuz için çalışmayabilir. Pencereyi ekrandan gösterir misiniz, bir baskı yapıp tekrar gizler misiniz?

 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

İlginç burada bir göz, onu denedim ama hiçbir sonuç var. Bir kod veya bir link gönderebilir misin? Teşekkürler – cbrulak

+2

Bu, en azından benim durumumda değil, küçültülmüş/gizli pencereler için çalışmıyor. Ancak, pencere kapalı iken 'PrintWindow' kullanarak ekran iyi bir alternatiftir. –

+0

Ruud, evet haklısınız, pencereyi ekrandan göstermeniz, printwindow, sonra tekrar minimize etmelisiniz. –

1

WM_PRINT ve WM_PRINTCLIENT iletileriniz varsa, içeriğinizin HDC içine işlenmesini sağlayan pencereye gönderebilirsiniz.

Ancak, bunlar mükemmel değil: standart Win32 denetimleri bunları doğru şekilde ele alırken, uygulamadaki tüm özel denetimler olmayabilir.

0

Kısmen gizlenmiş denetimlerin bit eşlemini almaya çalışıyorum.

Çizimden önce kodu kullandım, ancak üst üste binen pencereleri dahil ettim. Yani .. belki bunu denemek istersiniz. WM_PRINTCLIENT (benim anlayışımda), gerçekten görünmese bile, kontrolün tümünü yeniden çizmelidir.

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

Önceki kod şimdi yorumlanmıştır. Burada bulunan kod dayanmaktadır: Pocket PC: Draw control to bitmap (kabul edilen cevap). Temelde Tim Robinson'ın bu konudaki önerileriyle aynı. Ayrıca

, http://www.tcx.be/blog/2004/paint-control-onto-graphics/

İlgili konular