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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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]