import array import cv2 import numpy import win32con import win32gui import win32ui def is_visible(hwnd): return win32gui.IsWindowVisible(hwnd) 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, is_test=False): 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() if not is_test: # 为bitmap开辟存储空间 saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) # 将截图保存到saveBitMap中 saveDC.SelectObject(saveBitMap) # 保存bitmap到内存设备描述表 saveDC.BitBlt((0, 0), (ow, h), mfcDC, (rect[0], rect[1]), win32con.SRCCOPY) else: # 为bitmap开辟存储空间 saveBitMap.CreateCompatibleBitmap(mfcDC, ow, oh) # 将截图保存到saveBitMap中 saveDC.SelectObject(saveBitMap) # 保存bitmap到内存设备描述表 saveDC.BitBlt((0, 0), (ow, oh), mfcDC, (0, 0), win32con.SRCCOPY) # 保存数据 saveBitMap.SaveBitmapFile(saveDC, "test_origin.png") # 内存释放 win32gui.DeleteObject(saveBitMap.GetHandle()) saveDC.DeleteDC() mfcDC.DeleteDC() win32gui.ReleaseDC(hwnd, hWndDC) #########################保存最新的数据########################## hWndDC = win32gui.GetWindowDC(hwnd) mfcDC = win32ui.CreateDCFromHandle(hWndDC) saveDC = mfcDC.CreateCompatibleDC() # 创建位图对象准备保存图片 saveBitMap = win32ui.CreateBitmap() saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) # 将截图保存到saveBitMap中 saveDC.SelectObject(saveBitMap) saveDC.BitBlt((0, 0), (ow, h), mfcDC, (rect[0], rect[1]), win32con.SRCCOPY) saveBitMap.SaveBitmapFile(saveDC, "test_origin_clip.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