我可以使用PIL来抓取桌面的截图,然后使用pywin32获取其矩形并裁剪出我想要的部分。但是,如果有东西挡在我想要的窗口前面,它将遮挡住我想要截屏的应用程序。有没有办法获取Windows当前正在显示的应用程序?即使其他窗口在其前面时,它也会有这些数据。
我可以使用PIL来抓取桌面的截图,然后使用pywin32获取其矩形并裁剪出我想要的部分。但是,如果有东西挡在我想要的窗口前面,它将遮挡住我想要截屏的应用程序。有没有办法获取Windows当前正在显示的应用程序?即使其他窗口在其前面时,它也会有这些数据。
PrintWindow
函数。
这是复制隐藏窗口图像的“正确”方法,但这并不意味着它总是有效。它取决于程序实现适当的消息和WM_Print
响应。PrintWindow
无效,则唯一剩下的选择是将窗口置于前台,然后进行BitBlit
。我通过先将我想要聚焦的应用程序获取焦点,然后再进行截屏,这样做也可以达到相同的效果:
shell=win32com.client.Dispatch("Wscript.Shell")
success = shell.AppActivate(app_name) # Returns true if focus given successfully.
有一种方法可以实现这个功能,使用 PrintWindow
函数。它会导致窗口在另一个表面上重新绘制。
这段代码对于后台运行的应用程序有效,但不适用于最小化的应用程序。
运行以下命令进行安装: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)
如果我没记错,在Windows Vista之前没有Aero - 每个窗口都有自己的缓冲区,但在那之前,你只能使用你的方法来获取矩形。我不确定pywin32是否支持Aero。