截取应用程序的屏幕截图,无论前面有什么?

7

我可以使用PIL来抓取桌面的截图,然后使用pywin32获取其矩形并裁剪出我想要的部分。但是,如果有东西挡在我想要的窗口前面,它将遮挡住我想要截屏的应用程序。有没有办法获取Windows当前正在显示的应用程序?即使其他窗口在其前面时,它也会有这些数据。


2
“它在某个地方有那些数据”并不总是正确的。您为什么这么说呢?在许多情况下,当顺序改变时,窗口必须重新绘制。 - S.Lott
是的,这个问题是没有意义的,因为不可见的东西可能不存在,你想获取它的最后绘制状态吗?因为当前状态就是你看到的,什么也没有。 - Anurag Uniyal
1
当一个更大的阴影覆盖了我的阴影时,问我的阴影的形状是什么,就像在询问一样。 - Anurag Uniyal
@Anurag:除了这种情况,你可以让你的阴影在另一个表面上绘制 =) - Claudiu
1
可能是Python Screenshot of inactive window PrintWindow + win32gui的重复问题。 - Tobias Kienzler
7个回答

6
我在此回答中发布了有效的代码:Screenshot of inactive window PrintWindow + win32gui。它使用PrintWindow函数。 这是复制隐藏窗口图像的“正确”方法,但这并不意味着它总是有效。它取决于程序实现适当的消息和WM_Print响应。
如果尝试使用PrintWindow无效,则唯一剩下的选择是将窗口置于前台,然后进行BitBlit

4

我通过先将我想要聚焦的应用程序获取焦点,然后再进行截屏,这样做也可以达到相同的效果:

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

2

有一种方法可以实现这个功能,使用 PrintWindow 函数。它会导致窗口在另一个表面上重新绘制。


2
也许你可以把应用程序定位到屏幕外,然后截图,再放回来?

2

这段代码对于后台运行的应用程序有效,但不适用于最小化的应用程序。

运行以下命令进行安装:pip install pywin32

import win32gui
import win32ui

def background_screenshot(hwnd, width, height):
    wDC = win32gui.GetWindowDC(hwnd)
    dcObj=win32ui.CreateDCFromHandle(wDC)
    cDC=dcObj.CreateCompatibleDC()
    dataBitMap = win32ui.CreateBitmap()
    dataBitMap.CreateCompatibleBitmap(dcObj, width, height)
    cDC.SelectObject(dataBitMap)
    cDC.BitBlt((0,0),(width, height) , dcObj, (0,0), win32con.SRCCOPY)
    dataBitMap.SaveBitmapFile(cDC, 'screenshot.bmp')
    dcObj.DeleteDC()
    cDC.DeleteDC()
    win32gui.ReleaseDC(hwnd, wDC)
    win32gui.DeleteObject(dataBitMap.GetHandle())

hwnd = win32gui.FindWindow(None, windowname)
background_screenshot(hwnd, 1280, 780)

1
如果可以的话,尝试保存窗口的顺序,然后将您的应用程序移到前面,截屏并迅速移回。可能会产生一些烦人的闪烁,但这可能比没有好。

是的,除非有一个可以拍摄特定截图的专门函数,否则我也会这样做。 - Geo

0

如果我没记错,在Windows Vista之前没有Aero - 每个窗口都有自己的缓冲区,但在那之前,你只能使用你的方法来获取矩形。我不确定pywin32是否支持Aero。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接