Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windows application screenshot #4415

Open
smallfish06 opened this issue Feb 11, 2020 · 9 comments · May be fixed by #8516
Open

Windows application screenshot #4415

smallfish06 opened this issue Feb 11, 2020 · 9 comments · May be fixed by #8516

Comments

@smallfish06
Copy link

smallfish06 commented Feb 11, 2020

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 radarhere changed the title windows 10 virtual desktop support Windows 10 virtual desktop support Feb 11, 2020
@radarhere
Copy link
Member

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
Copy link
Author

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
Copy link
Contributor

nulano commented Feb 11, 2020

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
Copy link
Author

smallfish06 commented Feb 11, 2020

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
Copy link
Contributor

nulano commented Feb 19, 2020

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
Copy link
Author

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
Copy link
Contributor

nulano commented Feb 26, 2020

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

@smallfish06
Copy link
Author

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

@radarhere
Copy link
Member

radarhere commented Oct 31, 2024

I've created #8516 to resolve this by adding a handle argument to ImageGrab.grab() that accepts a HWND.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants