QQ托盘隐藏时用SW_SHOWNA恢复窗口(不触发托盘弹窗)+poll结束后自动SW_HIDE缩回托盘+验证不通过不再直接报窗口不可用
This commit is contained in:
+26
-1
@@ -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 张。"""
|
||||
|
||||
Reference in New Issue
Block a user