QQ托盘隐藏时用SW_SHOWNA恢复窗口(不触发托盘弹窗)+poll结束后自动SW_HIDE缩回托盘+验证不通过不再直接报窗口不可用

This commit is contained in:
youpaishidifu
2026-07-26 17:21:09 +08:00
parent e7f3adaa73
commit 8f9433983f
+26 -1
View File
@@ -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 张。"""