修复Q窗口托盘恢复用SW_SHOWNORMAL替代SW_SHOWNA: SW_SHOWNA触发托盘预览弹窗而非主窗口
This commit is contained in:
+12
-16
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user