From ec060ce444cdd1c48a54686cadbc8950478eedcf Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期五, 22 八月 2025 16:27:34 +0800
Subject: [PATCH] 网页内容修改

---
 win32_util.py |  126 +++++++++++++++++++++++++++++++++++------
 1 files changed, 106 insertions(+), 20 deletions(-)

diff --git a/win32_util.py b/win32_util.py
index 37d9aa5..5c5fc10 100644
--- a/win32_util.py
+++ b/win32_util.py
@@ -2,30 +2,71 @@
 
 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 = []
     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)
+            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
@@ -51,7 +92,7 @@
 
 
 # rect鏍煎紡涓猴細锛堝乏,涓�,鍙�,涓嬪潗鏍囷級
-def window_capture(hwnd, rect, scale):
+def window_capture(hwnd, rect, scale, is_test=False):
     rect_ = win32gui.GetWindowRect(hwnd)
     ow = rect_[2] - rect_[0]
     oh = rect_[3] - rect_[1]
@@ -69,15 +110,40 @@
     saveDC = mfcDC.CreateCompatibleDC()
     # 鍒涘缓浣嶅浘瀵硅薄鍑嗗淇濆瓨鍥剧墖
     saveBitMap = win32ui.CreateBitmap()
-    # 涓篵itmap寮�杈熷瓨鍌ㄧ┖闂�
-    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")
+
+    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)
 
@@ -93,6 +159,26 @@
     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))

--
Gitblit v1.8.0