python-pillow / Pillow

Python Imaging Library (Fork)
https://python-pillow.org
Other
12.2k stars 2.22k forks source link

Windows application screenshot #4415

Open smallfish06 opened 4 years ago

smallfish06 commented 4 years ago

windows 10 supports built-in virtual desktop. But when I change desktop from A to B while Pillow process takes screenshot in A, then I get B's screenshot.

The thing i want to know is, was this intended? Cause i don't know well about pillow's goal. If this is not intended, i'm planning to improve window screen grabber

https://github.com/nulano/Pillow/blob/3c311f5619b1b82e2b91cd2a42e3a44b9526755c/src/display.c#L323

radarhere commented 4 years ago

I don't understand the situation you're describing. Could you rephrase?

Depending on what you're talking about, you may find the 'all_screens' argument helpful - https://pillow.readthedocs.io/en/stable/reference/ImageGrab.html#PIL.ImageGrab.PIL.ImageGrab.grab

Also, be aware that you've linked to code from a fork of Pillow, not the main Pillow repository itself.

smallfish06 commented 4 years ago

Sorry for linked to code from a fork of Pillow

https://community.windows.com/en-us/stories/virtual-desktop-windows-10

Windows 10 supports virtual desktop itself. Not the Hyper-V function that we used before.

image

If i run a script that take a screen shot after 5 seconds, using imagegrab at desktop3 And i change immediately to desktop2

In this case the screenshot is taken in desktop2 even it's running in desktop3

unfortunately even if i use include_layered_windows, all_screens it only takes screenshots of desktop3

nulano commented 4 years ago

Unfortunately, I don't think it is possible to do what you are trying to do. Windows seems to only draw the current desktop, see this Stack Overflow question.

smallfish06 commented 4 years ago

Then I think this problem can be solved with 'screenshot of a specific application'

https://stackoverflow.com/questions/19695214/python-screenshot-of-inactive-window-printwindow-win32gui

i successed capturing specific image in other desktop by using this win32gui method. But only if it is visible.

image

capture from desktop1

test

How do you think of implementing 'screenshot of a specific application'?

nulano commented 4 years ago

PrintWindow uses a different mechanism not involving the Desktop Window Manager (which is AFAIK the layer implementing virtual desktops on Windows), so it makes sense that it works for this.

I can see two options for where this could be implemented: ImageGrab (which currently deals with desktop screenshots and the clipboard for Windows and macOS) and ImageWin (according to the docs, it seems to be used to draw images directly to HDCs -- Windows Device Contexts). Either way, I expect that the new function would take HWND as a parameter. This would probably be best implemented in C, not with win32gui.

smallfish06 commented 4 years ago

Is it possible for me to add such C extension on specific part? I mean are there any extension guide or C code repository? I have no idea where to add those codes

nulano commented 4 years ago

Display related Windows C code is in the display.c file.

smallfish06 commented 4 years ago

thanks:) I'll submit pull request when done with display.c and ImageWin