From 8f9433983fe3d81386bf048c4411651f57b868d6 Mon Sep 17 00:00:00 2001 From: youpaishidifu Date: Sun, 26 Jul 2026 17:21:09 +0800 Subject: [PATCH] =?UTF-8?q?QQ=E6=89=98=E7=9B=98=E9=9A=90=E8=97=8F=E6=97=B6?= =?UTF-8?q?=E7=94=A8SW=5FSHOWNA=E6=81=A2=E5=A4=8D=E7=AA=97=E5=8F=A3(?= =?UTF-8?q?=E4=B8=8D=E8=A7=A6=E5=8F=91=E6=89=98=E7=9B=98=E5=BC=B9=E7=AA=97?= =?UTF-8?q?)+poll=E7=BB=93=E6=9D=9F=E5=90=8E=E8=87=AA=E5=8A=A8SW=5FHIDE?= =?UTF-8?q?=E7=BC=A9=E5=9B=9E=E6=89=98=E7=9B=98+=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E4=B8=8D=E9=80=9A=E8=BF=87=E4=B8=8D=E5=86=8D=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E6=8A=A5=E7=AA=97=E5=8F=A3=E4=B8=8D=E5=8F=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- monitor.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/monitor.py b/monitor.py index 8c223ae..1b0643b 100644 --- a/monitor.py +++ b/monitor.py @@ -533,12 +533,24 @@ class MessageMonitor: """验证窗口是否确实是 QQ/TIM 进程。 检查项(全过才返回 True): - 1. 窗口存在且可见 + 1. 窗口存在且可见(隐藏状态尝试 SW_SHOW 恢复) 2. 窗口未最小化 3. 所属进程名称匹配 QQ.exe / TIM.exe """ if not win32gui.IsWindow(hwnd): return False + # QQ NT 缩到托盘时 IsWindowVisible=False,尝试恢复(SW_SHOWNA=不激活,不触发托盘弹窗) + if not win32gui.IsWindowVisible(hwnd): + if win32gui.IsIconic(hwnd): + win32gui.ShowWindow(hwnd, win32con.SW_RESTORE) + else: + # SW_SHOWNA (0x0008): 显示但不激活窗口,避免 QQ 弹出托盘预览而非主窗口 + win32gui.ShowWindow(hwnd, win32con.SW_SHOWNA) + time.sleep(0.3) + if not win32gui.IsWindowVisible(hwnd): + # 试一次 SW_SHOW(激活式显示,可能触发托盘弹窗但作为最后手段) + win32gui.ShowWindow(hwnd, win32con.SW_SHOW) + time.sleep(0.3) if not win32gui.IsWindowVisible(hwnd): return False if win32gui.IsIconic(hwnd): @@ -1474,6 +1486,11 @@ class MessageMonitor: logger.debug(f"[{platform}] 窗口未找到") return + # QQ: 记录窗口是否处于托盘隐藏状态,用于 poll 结束后自动缩回托盘 + qq_was_hidden = (platform == "qq" and hwnd + and win32gui.IsWindow(hwnd) + and not win32gui.IsWindowVisible(hwnd)) + # 2. 从 HWND 创建全新 Control(绕过缓存) win = self._fresh_window(platform) if not win: @@ -1584,6 +1601,14 @@ class MessageMonitor: self._cached_hwnd.pop(platform, None) self._cached_pid.pop(platform, None) + # QQ: poll 结束后,如果之前是托盘隐藏状态,缩回托盘(不留窗口在桌面) + if qq_was_hidden: + try: + if win32gui.IsWindow(hwnd): + win32gui.ShowWindow(hwnd, win32con.SW_HIDE) + except Exception: + pass + def _clean_old_ocr_debug(dir_path: str, keep: int = 20): """清理 ocr_debug_*.png 文件,只保留最近 keep 张。"""