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