# 对后台窗口截图
import win32gui, win32ui, win32con
import cv2
import numpy
def background_capture(hWnd, save_img_path):
# os.popen(r"C:\Users\mkn1szh\Desktop\scrcpy-win64-v1.17\scrcpy.exe")
# os.popen("adb shell am start com.android.car.settings")
# time.sleep(1)
hwnd = win32gui.FindWindow("SDL_app", "aegean")
print(hwnd)
# 获取后台窗口的句柄,注意后台窗口不能最小化
hWnd = win32gui.FindWindow("SDL_app", "aegean") # 窗口的类名可以用Visual Studio的SPY++工具获取
# 获取句柄窗口的大小信息
# left, top, right, bot = win32gui.GetWindowRect(hWnd)
# print(left, top, right, bot)
width = 1456
height = 735
# 返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框
hWndDC = win32gui.GetWindowDC(hWnd)
# 创建设备描述表
mfcDC = win32ui.CreateDCFromHandle(hWndDC)
# 创建内存设备描述表
saveDC = mfcDC.CreateCompatibleDC()
# 创建位图对象准备保存图片
saveBitMap = win32ui.CreateBitmap()
# 为bitmap开辟存储空间
saveBitMap.CreateCompatibleBitmap(mfcDC, width, height)
# 将截图保存到saveBitMap中
saveDC.SelectObject(saveBitMap)
# 保存bitmap到内存设备描述表
saveDC.BitBlt((0, 0), (width, height), mfcDC, (0, 0), win32con.SRCCOPY)
###获取位图信息
signedIntsArray = saveBitMap.GetBitmapBits(True)
# 内存释放
win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hWnd, hWndDC)
# 保存到文件
img = numpy.frombuffer(signedIntsArray, dtype='uint8')
img.shape = (height, width, 4)
cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
cv2.imwrite(save_img_path, img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])