python - 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.')
解决方案
那是一个 OpenGL 或 Direct3D 应用程序。它不会绘制到自己的窗口。它创建纹理和表面,并让显卡将其显示列表直接渲染到帧缓冲区中。
推荐阅读
- php - Idgenerator laravel 8,如何修复异常“表字段类型为 bigint 但前缀为字符串”
- c++ - Qt 应用程序内存使用情况
- asp.net - 在 ASP.NET 中使用 AJAX 在 Web 服务中调用多个函数
- javascript - Javascript OOP - SyntaxError:标识符“密码”已被声明
- android - ViewCompat.setOnApplyWindowInsetsListener 在将视图视为属性时不生效
- javascript - 计算字符串中的相同字母但不是全部长度
- javascript - 我一直在创建一个简单的验证。如何获取用户输入的输入并验证我的数据?
- reactjs - axios调用jsp文件
- python - 如何使输入类型和重量类型相同?
- google-apps-script - 如何在不同的文件中使用 GAS 类,与文件加载顺序无关?