"""
|
截图工具
|
"""
|
import cv2
|
import numpy
|
import win32con
|
import win32gui
|
import win32ui
|
|
|
def window_capture(hwnd):
|
rect = win32gui.GetWindowRect(hwnd)
|
w = rect[2] - rect[0]
|
h = rect[3] - rect[1]
|
if w == 0 or h == 0:
|
return None
|
# 返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框
|
hWndDC = win32gui.GetWindowDC(hwnd)
|
# 创建设备描述表
|
mfcDC = win32ui.CreateDCFromHandle(hWndDC)
|
# 创建内存设备描述表
|
saveDC = mfcDC.CreateCompatibleDC()
|
# 创建位图对象准备保存图片
|
saveBitMap = win32ui.CreateBitmap()
|
# 为bitmap开辟存储空间
|
saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
|
# 将截图保存到saveBitMap中
|
saveDC.SelectObject(saveBitMap)
|
# 保存bitmap到内存设备描述表
|
saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY)
|
|
signedIntsArray = saveBitMap.GetBitmapBits(True)
|
|
# 内存释放
|
win32gui.DeleteObject(saveBitMap.GetHandle())
|
saveDC.DeleteDC()
|
mfcDC.DeleteDC()
|
win32gui.ReleaseDC(hwnd, hWndDC)
|
|
im_opencv = numpy.frombuffer(signedIntsArray, dtype='uint8')
|
im_opencv.shape = (h, w, 4)
|
cv2.cvtColor(im_opencv, cv2.COLOR_BGRA2RGB)
|
return im_opencv
|