使用 win32api python 捕获屏幕截图返回黑色图像

Zan*_*nga 2 python winapi screenshot pywin32 win32gui

我使用以下代码示例来捕获屏幕截图:

/sf/answers/228256801/ /sf/answers/1704667191/

当对 Firefox 或 Chrome 进行屏幕截图时,它们会返回空白的黑色图像。捕获记事本的屏幕截图效果很好。我对此做了一些研究,我认为这是因为它们是 GPU 加速的。其他屏幕截图库也可以工作,但我需要它,这样我就可以捕获应用程序的屏幕截图,即使它当前不可见。

有没有人解决了类似的问题,或者有人可以指出我正确的方向吗?谢谢。

Str*_*Sun 5

根据@Barmak之前的回答,我将C++代码转换为python,现在它可以工作了。

import win32gui
import win32ui
import win32con
from ctypes import windll
from PIL import Image
import time
import ctypes

hwnd_target = 0x00480362 #Chrome handle be used for test 

left, top, right, bot = win32gui.GetWindowRect(hwnd_target)
w = right - left
h = bot - top

win32gui.SetForegroundWindow(hwnd_target)
time.sleep(1.0)

hdesktop = win32gui.GetDesktopWindow()
hwndDC = win32gui.GetWindowDC(hdesktop)
mfcDC  = win32ui.CreateDCFromHandle(hwndDC)
saveDC = mfcDC.CreateCompatibleDC()

saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)

saveDC.SelectObject(saveBitMap)

result = saveDC.BitBlt((0, 0), (w, h), mfcDC, (left, top), win32con.SRCCOPY)

bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)

im = Image.frombuffer(
    'RGB',
    (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
    bmpstr, 'raw', 'BGRX', 0, 1)

win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hdesktop, hwndDC)

if result == None:
    #PrintWindow Succeeded
    im.save("test.png")
Run Code Online (Sandbox Code Playgroud)

请注意:Firefox 使用无窗口控件

如果你想获得 Firefox 的句柄,你可能需要UI Automation

详细解释请参考@IInspectable的回答