import win32gui,win32ui,win32con import numpy as np class Region_Detector(object): def __init__(self,win_name,win_more): self.win_name = win_name self.win_more = win_more def getWindowHandle(self): hwnd_title = {} def getAllWindowHandle(hwnd,use): if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd): hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)}) win32gui.EnumWindows(getAllWindowHandle,None) new_dict = {v: k for k, v in hwnd_title.items()} return new_dict[self.win_name] @staticmethod def getButtonInfo(): hwnd_title = {} def getAllWindowHandle(hwnd, use): if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd): hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)}) win32gui.EnumWindows(getAllWindowHandle, None) return hwnd_title def setWindows(self,hwdn,win_size=[1920, 1080],win_index=[0,0]): """设置窗口大小尺寸并置顶""" win32gui.SetWindowPos(hwdn, win32con.HWND_TOPMOST, win_index[0], win_index[1], win_size[0], win_size[1], win32con.SWP_NOSIZE| win32con.SWP_SHOWWINDOW) def getWindowsRGB(self,hwnd): """游戏窗口截图""" hwndDC = win32gui.GetWindowDC(hwnd) # 根据窗口句柄获取窗口的设备上下文DC(Device Context) mfcDC = win32ui.CreateDCFromHandle(hwndDC) # 根据窗口的DC获取mfcDC saveDC = mfcDC.CreateCompatibleDC() # mfcDC创建可兼容的DC saveBitMap = win32ui.CreateBitmap() # 创建bigmap准备保存图片 rctA = win32gui.GetWindowRect(hwnd) Screen_w = rctA[2] - rctA[0] # 游戏界面宽度 Screen_h = rctA[3] - rctA[1] # 游戏界面高度 # 获取图片大小 # 截取从左上角(0,0)长宽为(w,h)的图片 saveBitMap.CreateCompatibleBitmap(mfcDC, Screen_w, Screen_h) # 为bitmap开辟空间 saveDC.SelectObject(saveBitMap) # 高度saveDC,将截图保存到saveBitmap中 saveDC.BitBlt((0, 0), (Screen_w, Screen_h), mfcDC, (0, 0), win32con.SRCCOPY) signedIntsArray = saveBitMap.GetBitmapBits(True) img = np.frombuffer(signedIntsArray, dtype="uint8") img.shape = (Screen_h, Screen_w, 4) # bit图转mat图 win32gui.DeleteObject(saveBitMap.GetHandle()) mfcDC.DeleteDC() saveDC.DeleteDC() # 释放内存 return img, (Screen_w,Screen_h) # 转为RGB图返回 def getRegion(self,img,Screen): Screen_w,Screen_h = Screen[0],Screen[1]-self.win_more Screen_cx = Screen_w // 2 # 游戏界面中心x Screen_cy = Screen_h // 2 # 游戏界面中心y Screen_c = [Screen_cx, Screen_cy] # 游戏界面中心坐标 x0 = Screen_w // 3 # 游戏界面检测框左上角x0 y0 = Screen_h // 3 # 游戏界面检测框左上角y0 x1 = 2*x0 # 游戏界面检测框右下角x1 y1 = 2*y0 # 游戏界面检测框右下角y1 # 选取roi = img[y0,y1,x0,x1]窗口 roi = img[int(y0):int(y1),int(x0):int(x1)] return roi,Screen_c,[x0,y0+self.win_more,x1,y1+self.win_more]