From ec060ce444cdd1c48a54686cadbc8950478eedcf Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期五, 22 八月 2025 16:27:34 +0800 Subject: [PATCH] 网页内容修改 --- win32_util.py | 161 +++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 131 insertions(+), 30 deletions(-) diff --git a/win32_util.py b/win32_util.py index 4a1cb3d..5c5fc10 100644 --- a/win32_util.py +++ b/win32_util.py @@ -2,33 +2,76 @@ import cv2 import numpy +import win32api import win32con import win32gui import win32ui +import ctypes +from ctypes import wintypes + +from utils import invalid_hwnds_manager + + +def is_visible(hwnd): + return win32gui.IsWindowVisible(hwnd) + + +# 瀹氫箟甯搁噺 +SMTO_NORMAL = 0x0000 +SMTO_BLOCK = 0x0001 +SMTO_ABORTIFHUNG = 0x0002 +SMTO_NOTIMEOUTIFNOTHUNG = 0x0008 + +text_hwnds_doing = set() + + +def get_title(hwnd): + length = ctypes.c_int(256) + buffer = ctypes.create_unicode_buffer(length.value) + ctypes.windll.user32.SendMessageTimeoutW( + hwnd, + ctypes.c_int(0x000D), # WM_GETTEXT + ctypes.c_int(255), + ctypes.c_void_p(buffer), + ctypes.c_int(0x0002), # SMTO_ABORTIFHUNG + ctypes.c_int(1000), + ctypes.pointer(ctypes.c_int(0)) + ) + return buffer.value 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() + text_hwnds_doing.add(hwnd) + try: + 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() + finally: + text_hwnds_doing.discard(hwnd) # 鏍规嵁鏍囬妯$硦鍖归厤 -def search_window(title): +def search_window(title, max_count=3): + invalid_hwnds = invalid_hwnds_manager.get_hwnds() hwnds = [] - hwnd = win32gui.GetDesktopWindow() - temp = None - while True: - if temp and win32gui.IsWindowVisible(temp): - str_ = getText(temp) - if str_.find(title) > -1: - hwnds.append(temp) - print(str_) - temp = win32gui.FindWindowEx(hwnd, temp, None, None) - if not temp: - break + try: + hwnd = win32gui.GetDesktopWindow() + temp = None + while True: + if temp not in invalid_hwnds: + if temp and win32gui.IsWindowVisible(temp): + str_ = getText(temp) + if str_.find(title) > -1: + hwnds.append(temp) + if len(hwnds) >= max_count: + break + temp = win32gui.FindWindowEx(hwnd, temp, None, None) + if not temp: + break + except: + pass return hwnds @@ -43,7 +86,18 @@ win32gui.PostMessage(hwnd, win32con.WM_KEYUP, code, 0) -def window_capture(hwnd, rect): +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: @@ -56,18 +110,42 @@ saveDC = mfcDC.CreateCompatibleDC() # 鍒涘缓浣嶅浘瀵硅薄鍑嗗淇濆瓨鍥剧墖 saveBitMap = win32ui.CreateBitmap() - # 涓篵itmap寮�杈熷瓨鍌ㄧ┖闂� - saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) - # 灏嗘埅鍥句繚瀛樺埌saveBitMap涓� - saveDC.SelectObject(saveBitMap) - # 淇濆瓨bitmap鍒板唴瀛樿澶囨弿杩拌〃 - saveDC.BitBlt((0, 0), (w, h), mfcDC, (rect[0], rect[1]), win32con.SRCCOPY) - # 淇濆瓨鏁版嵁 - # saveBitMap.SaveBitmapFile(saveDC, "test.png") + + if not is_test: + # 涓篵itmap寮�杈熷瓨鍌ㄧ┖闂� + saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) + # 灏嗘埅鍥句繚瀛樺埌saveBitMap涓� + saveDC.SelectObject(saveBitMap) + # 淇濆瓨bitmap鍒板唴瀛樿澶囨弿杩拌〃 + saveDC.BitBlt((0, 0), (ow, h), mfcDC, (rect[0], rect[1]), win32con.SRCCOPY) + else: + # 涓篵itmap寮�杈熷瓨鍌ㄧ┖闂� + 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()) @@ -81,6 +159,29 @@ return im_opencv +def move_window(hwnd, x, y): + """ + 绉诲姩绐楀彛 + :param hwnd: + :param x: + :param y: + :return: + """ + try: + # 鑾峰彇绐楀彛鐨勫綋鍓嶇煩褰㈠尯鍩� + rect = win32gui.GetWindowRect(hwnd) + width = rect[2] - rect[0] + height = rect[3] - rect[1] + # 绉诲姩绐楀彛鍒版寚瀹氫綅缃� (x, y)锛屽苟淇濇寔绐楀彛鐨勫搴﹀拰楂樺害涓嶅彉 + win32gui.MoveWindow(hwnd, x, y, width, height, True) + print(f"绐楀彛宸茬Щ鍔ㄥ埌浣嶇疆 ({x}, {y})") + except Exception as e: + print(f"绉诲姩绐楀彛澶辫触: {e}") + + if __name__ == "__main__": - print(search_window("鍓睆1")) - visual_click(0x00152876, (110, 90)) + # print(search_window("鍓睆1")) + # visual_click(0x00152876, (110, 90)) + + window_capture(0x00010986, (0, 0, 1920, 895)) + # pass -- Gitblit v1.8.0