修复Q窗口托盘恢复用SW_SHOWNORMAL替代SW_SHOWNA: SW_SHOWNA触发托盘预览弹窗而非主窗口

This commit is contained in:
youpaishidifu
2026-07-26 17:38:11 +08:00
parent 8f9433983f
commit 86686d0e22
+12 -16
View File
@@ -533,29 +533,25 @@ class MessageMonitor:
"""验证窗口是否确实是 QQ/TIM 进程。
检查项(全过才返回 True):
1. 窗口存在且可见(隐藏状态尝试 SW_SHOW 恢复)
2. 窗口未最小化
1. 窗口存在
2. 窗口可见 / 自动恢复(隐藏/最小化用 SW_SHOWNORMAL 弹回主窗口)
3. 所属进程名称匹配 QQ.exe / TIM.exe
⚠️ 不能用 SW_SHOWNA:QQ NT 在隐藏窗口上调用 SW_SHOWNA 触发托盘预览弹窗
而非恢复主窗口。必须 SW_SHOWNORMAL(激活式)才能弹出正确的主窗口。
"""
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)
# 隐藏(托盘)或最小化 → 用 SW_SHOWNORMAL 恢复主窗口
if not win32gui.IsWindowVisible(hwnd) or win32gui.IsIconic(hwnd):
root = win32gui.GetAncestor(hwnd, win32con.GA_ROOT)
if win32gui.IsIconic(root):
win32gui.ShowWindow(root, 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)
win32gui.ShowWindow(root, win32con.SW_SHOWNORMAL)
time.sleep(0.5)
if not win32gui.IsWindowVisible(hwnd):
return False
if win32gui.IsIconic(hwnd):
# 最小化 → 没崩溃但截屏会截到别处
return False
# 验证进程名
try:
_, pid = win32process.GetWindowThreadProcessId(hwnd)