Screenshot an application, regardless of what's in front of it?

12,097

Solution 1

I've done the same thing by giving the application I want focus before taking the shot:

shell=win32com.client.Dispatch("Wscript.Shell")
success = shell.AppActivate(app_name) # Returns true if focus given successfully.

Solution 2

I posted working code in the answer here: Screenshot of inactive window PrintWindow + win32gui. It uses the PrintWindow function. This is the "correct" way to copy the image of a hidden window, but that doesn't mean that it will always work. It depends on the program implementing the proper message, WM_Print response.

If you try to use PrintWindow it doesn't work, then your only remaining option would be to bring the window to the front before taking a BitBlit.

Solution 3

There is a way to do this, using the PrintWindow function. It causes the window to redraw itself on another surface.

Solution 4

If you can, try saving the order of the windows, then move your app to the front, screenshot, and move it back really quickly. Might produce a bit of annoying flicker, but it might be better than nothing.

Solution 5

Maybe you can position the app offscreen, then take the screenshot, then put it back?

Share:
12,097
Admin
Author by

Admin

Updated on August 16, 2022

Comments

  • Admin
    Admin over 1 year

    So I can use PIL to grab a screenshot of the desktop, and then use pywin32 to get its rectangle and crop out the part I want. However, if there's something in front of the window I want, it'll occlude the application I wanted a screenshot of. Is there any way to get what windows would say an application is currently displaying? It has that data somewhere, even when other windows are in front of it.