Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capturing a Window that is hidden or minimized

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 rendering that bitmap in a different window.

My question:

When that window is minimized or hidden (SW_HIDE) my screen capture doesn't work, so is it possible to capture a window when it is minimized or hidden?

like image 777
cbrulak Avatar asked May 06 '09 16:05

cbrulak


People also ask

Can I record a minimized window?

No, because a minimized window isn't being rendered, so it can't be captured with OBS.

How do you take a screenshot of a minimized window?

Use the game bar to grab the computer screen: full or minimized screenshot on Windows operating system. Alt + Prt Sc (print screen button) screen capture. Windows + Print Screen screen capture. Use the Snipping Tool app to take a screenshot on Windows.

How do I capture a specific window?

Use the Snipping Tool in Windows, which highlights sections of the screen and allows you to save it as an image. Search for snipping tool , and click to open it. You can also capture the image of either the entire screen or only the currently active window using the PrtScrn or Print Screen key.

What is a captured window?

Window Capture allows you to capture a specific window and its contents. The advantages to using this source over Display Capture is that only the selected window will be shown, even if there are other windows in front of it.


2 Answers

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;
    }
like image 192
Maurice Flanagan Avatar answered Sep 28 '22 14:09

Maurice Flanagan


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.

like image 32
Tim Robinson Avatar answered Sep 28 '22 15:09

Tim Robinson