Capturing a Window that is hidden or minimized

后端 未结 3 1564
被撕碎了的回忆
被撕碎了的回忆 2020-12-03 04:27

I followed this tutorial (there\'s a bit more than what\'s listed here because in my code I get a window via mouse click) for grabbing a window as a bitmap and then renderin

相关标签:
3条回答
  • 2020-12-03 04:30

    The PrintWindow api works well, I use it for capturing thumbnails for hidden windows. Despite the name, it is different than WM_PRINT and WM_PRINTCLIENT, it works with pretty much every window except for Direct X / WPF windows.

    I added some code (C#) but after reviewing how I used the code, I realized that the window isn't actually hidden when I capture its bitmap, its just off screen so this may not work for your case. Could you show the window off screen, do a print and then hide it again?

            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 讨论(0)
  • 2020-12-03 04:51

    There are WM_PRINT and WM_PRINTCLIENT messages you can send to the window, which cause its contents to be rendered into the HDC of your choice.

    However, these aren't perfect: while the standard Win32 controls handle these correctly, any custom controls in the app might not.

    0 讨论(0)
  • 2020-12-03 04:51

    I am trying to get the bitmap of partially hidden controls.

    I used code before that did the drawing, but included windows overlapping it. So.. maybe you want to try this. The WM_PRINTCLIENT should (in my understanding) redraw all inside the control, even if it is not really 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);
    

    The before code is commented out now. It is based on the code found here: Pocket PC: Draw control to bitmap (accepted answer). It is basically the same as Tim Robinson suggests in this thread.

    Also, have a look here http://www.tcx.be/blog/2004/paint-control-onto-graphics/

    0 讨论(0)
提交回复
热议问题