You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
3.3 KiB

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)
# 根据窗口句柄获取窗口的设备上下文DCDevice 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] # 游戏界面高度
# 获取图片大小
# 截取从左上角00长宽为wh的图片
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]