首页 > 解决方案 > pywin32、win32gui窗口捕获黑屏

问题描述

我需要对特定应用程序进行屏幕截图。如果我抓取 Windows 桌面 ( hwnd = None),一切正常,但是当我尝试抓取特定应用程序的屏幕时出现黑屏,例如hwnd = win32gui.FindWindow(None, 'Albion Online Client').

import cv2 as cv
import numpy as np
import os
from time import time
import win32gui
import win32ui
import win32con

os.chdir(os.path.dirname(os.path.abspath(__file__)))

def window_capture():
    w = 1920  # set this
    h = 1080  # set this

    #hwnd = None ### Everything works
    hwnd = win32gui.FindWindow(None, 'Albion Online Client') ### Black Screen
    wDC = win32gui.GetWindowDC(hwnd)
    dcObj = win32ui.CreateDCFromHandle(wDC)
    cDC = dcObj.CreateCompatibleDC()
    dataBitMap = win32ui.CreateBitmap()
    dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
    cDC.SelectObject(dataBitMap)
    cDC.BitBlt((0, 0), (w, h), dcObj, (0, 0), win32con.SRCCOPY)

    #Save screenshoot
    #dataBitMap.SaveBitmapFile(cDC, 'debug.bmp' )
    signedIntsArray = dataBitMap.GetBitmapBits(True)
    img = np.fromstring(signedIntsArray, dtype='uint8')
    img.shape = (h, w, 4)

    # Free Resources
    dcObj.DeleteDC()
    cDC.DeleteDC()
    win32gui.ReleaseDC(hwnd, wDC)
    win32gui.DeleteObject(dataBitMap.GetHandle())

    img = img[..., :3]

    img = np.ascontiguousarray(img)
    return img
# initialize the WindowCapture clas

loop_time = time()
while(True):
  
    screenshot = window_capture()
    
    cv.imshow('Computer Vision', screenshot)

    # debug the loop rate
    print('FPS {}'.format(1 / (time() - loop_time)))
    loop_time = time()

    # press 'q' with the output window focused to exit.
    # waits 1 ms every loop to process key presses
    if cv.waitKey(1) == ord('q'):
        cv.destroyAllWindows()
        break

print('Done.')

标签: pythonpywin32win32gui

解决方案


那是一个 OpenGL 或 Direct3D 应用程序。它不会绘制到自己的窗口。它创建纹理和表面,并让显卡将其显示列表直接渲染到帧缓冲区中。


推荐阅读