后台截图句柄截图,后台区域截图,使用win32gui,win32ui,win32con,Image技术实现

发布时间 2023-04-09 00:08:44作者: 十二点零一分十一秒

import time
import win32gui,win32ui,win32con
import numpy as np
import cv2
from PIL import ImageGrab, Image
import ctypes
def window_capture(hwnd,xSrc, ySrc,w,h):
    hwndDC= win32gui.GetWindowDC(hwnd) #返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框
    mfcDC = win32ui.CreateDCFromHandle(hwndDC)#创建设备描述表
    saveDC = mfcDC.CreateCompatibleDC()#创建内存设备描述表
    saveBitMap = win32ui.CreateBitmap()#创建位图对象准备保存图片
    rctA = win32gui.GetWindowRect(hwnd)#获取句柄窗口的大小信息
    print(mfcDC)
    saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)#为bitmap开辟存储空间
    result = ctypes.windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 2)
    saveDC.SelectObject(saveBitMap)#将截图保存到saveBitMap中

    saveDC.BitBlt((0, 0), (w,h), mfcDC, (xSrc, ySrc), win32con.SRCCOPY)#保存bitmap到内存设备描述表(668, 406)
    signedIntsArray = saveBitMap.GetBitmapBits(True)###获取位图信息

    # print(saveBitMap)
    img = np.frombuffer(signedIntsArray, dtype="uint8")#保存到文件
    img.shape = (h, w, 4)
    # cv2.cvtColor(img, cv2.COLOR_RGBA2RGB)
    # 显示到屏幕
    # cv2.namedWindow('img') #命名窗口
    # cv2.imshow("img",img) #显示
    # cv2.waitKey(0)
    # cv2.destroyAllWindows()
    # cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
    num=0
    cv2.imwrite("./baotu_img/baotu_renwulan1.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
    win32gui.DeleteObject(saveBitMap.GetHandle()) #内存释放
    mfcDC.DeleteDC()
    saveDC.DeleteDC()
    return Image.fromarray(cv2.cvtColor(img, cv2.COLOR_RGBA2RGB))
hwnd:传入一个句柄dixSrc, 传入一个句柄内想截图位置的横(x)轴位置坐标 例如你想截一张 从句柄位置(100,200)就输入100,
ySrc, :传入一个句柄想截图位置的纵坐标(y)轴位置坐标,假如你想截取的位置在句柄上方顶点位置在(100,200)就输入200,(xsrc,ysrc)简单来说就是想截图位置上方顶点的坐标
w, 传入一个想要截图的 宽度(长度)不能大于句柄的最大宽度,也就说句柄大小为(700,620)时,(xsrc值为100时,最大能输入600,输入超过最大值会报错)
h: 传入一个想要截图的 高度 不能大于句柄的最大高度,也就说句柄大小为(700,620)时,(xsry值为200时,最大能输入420,输入超过最大值会报错)
return: 调用函数时回传一个 图片对象,
例如:
img = window_capture(8888,100, 200,50,20) 这样调用直接把8888句柄内的顶点为100,200位置开截图高度为20,长度为50的图片保存到img对象里