admin
2023-08-04 9dede2eaa1d3e68be387c5fd612eb48226a54c9d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import array
 
import cv2
import numpy
import win32con
import win32gui
import win32ui
 
 
def getText(hwnd):
    bufSize = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) + 1
    buffer = array.array('b', b'\x00\x00' * bufSize)
    win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, bufSize, buffer)
    text = win32gui.PyGetString(buffer.buffer_info()[0], bufSize - 1)
    return text.replace("\x00", "").strip()
 
 
# 根据标题模糊匹配
def search_window(title):
    hwnds = []
    try:
        hwnd = win32gui.GetDesktopWindow()
        temp = None
        while True:
            if temp and win32gui.IsWindowVisible(temp):
                str_ = getText(temp)
                if str_.find(title) > -1:
                    hwnds.append(temp)
            temp = win32gui.FindWindowEx(hwnd, temp, None, None)
            if not temp:
                break
    except:
        pass
    return hwnds
 
 
def visual_click(hwnd, pos):
    position = pos[1] * pow(16, 4) + pos[0]
    win32gui.PostMessage(hwnd, win32con.WM_LBUTTONDOWN, 0x00000001, position)
    win32gui.PostMessage(hwnd, win32con.WM_LBUTTONUP, 0x00000000, position)
 
 
def visual_keyboard(hwnd, code):
    win32gui.PostMessage(hwnd, win32con.WM_KEYDOWN, code, 0)
    win32gui.PostMessage(hwnd, win32con.WM_KEYUP, code, 0)
 
 
def visual_keyboard_F5(hwnd):
    win32gui.PostMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_F5, 0)
    win32gui.PostMessage(hwnd, win32con.WM_KEYUP, win32con.VK_F5, 0)
 
 
# rect格式为:(左,上,右,下坐标)
def window_capture(hwnd, rect, scale):
    rect_ = win32gui.GetWindowRect(hwnd)
    ow = rect_[2] - rect_[0]
    oh = rect_[3] - rect_[1]
    ow = int(ow * scale)
    oh = int(oh * scale)
    w = rect[2] - rect[0]
    h = rect[3] - rect[1]
    if w == 0 or h == 0:
        return None
    # 返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框
    hWndDC = win32gui.GetWindowDC(hwnd)
    # 创建设备描述表
    mfcDC = win32ui.CreateDCFromHandle(hWndDC)
    # 创建内存设备描述表
    saveDC = mfcDC.CreateCompatibleDC()
    # 创建位图对象准备保存图片
    saveBitMap = win32ui.CreateBitmap()
    # 为bitmap开辟存储空间
    saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
    # 将截图保存到saveBitMap中
    saveDC.SelectObject(saveBitMap)
    # 保存bitmap到内存设备描述表
    saveDC.BitBlt((0, 0), (ow, h), mfcDC, (rect[0], rect[1]), win32con.SRCCOPY)
    # saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY)
    # 保存数据
    # saveBitMap.SaveBitmapFile(saveDC, "test.png")
 
    signedIntsArray = saveBitMap.GetBitmapBits(True)
 
    # 内存释放
    win32gui.DeleteObject(saveBitMap.GetHandle())
    saveDC.DeleteDC()
    mfcDC.DeleteDC()
    win32gui.ReleaseDC(hwnd, hWndDC)
 
    im_opencv = numpy.frombuffer(signedIntsArray, dtype='uint8')
    im_opencv.shape = (h, w, 4)
    cv2.cvtColor(im_opencv, cv2.COLOR_BGRA2RGB)
    return im_opencv
 
 
if __name__ == "__main__":
    # print(search_window("副屏1"))
    # visual_click(0x00152876, (110, 90))
 
    window_capture(0x00010986, (0, 0, 1920, 895))
    # pass