
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]



