find wechat while closing block non-chat tabs in wechat

This commit is contained in:
cris 2026-04-24 18:07:40 +08:00
parent 1f3cbaa0f9
commit 392af1de29
5 changed files with 30 additions and 9 deletions

View File

@ -41,7 +41,7 @@ wechat_clicker/
- "..."按钮搜索限制在预览区域(独立窗口或主窗口 x>200排除侧边栏
- 可见性检查基于元素**中心点**是否在消息列表可见区域内30px margin
- 状态检测基于窗口计数 + **AXMinimized 属性**:区分窗口存在但最小化 vs 真正可见
- **窗口恢复策略**NSRunningApplication.unhide隐藏→ AX API 设置 AXMinimized=False最小化→ activate前台AppleScript 不可靠(微信不支持 miniaturized 属性)
- **窗口恢复策略4 层)**NSRunningApplication.unhide隐藏)→ 检测 0 窗口时 `open -b` 重新打开(窗口被关闭)→ AX API 设置 AXMinimized=False最小化→ activate前台
- **UNKNOWN 状态恢复**:先 Escape + Cmd+W 关闭可能的弹窗/多余窗口,再 activate + 点击侧边栏外层循环连续恢复失败时指数退避10s → 20s → 40s → ... → 120s 封顶),避免无效高频重试
## 使用方法
@ -68,12 +68,12 @@ python main.py --debug # 详细日志
- `config.yaml` 中可设置扫描间隔、延迟范围、白/黑名单、工作时间、媒体类型开关
- `max_chats_per_scan: 0` 表示不限制,处理全部未读聊天(适合大量群聊场景)
- 默认只点击图片(`media.click_files: false`, `media.click_videos: false`
- 默认黑名单包含微信系统账号
- 默认黑名单包含微信系统账号和非聊天界面(腾讯新闻、微信支付、微信团队、服务号、订阅号、文件传输助手)
- 处理完有未读的聊天后立即重扫,不等待 scan interval只有无未读时才 sleep
- 忙时(未读 > 5自动跳过随机休息
## 注意事项
- 微信窗口最小化或隐藏时工具会自动恢复(通过 AX API 设置 AXMinimized=False + NSRunningApplication activate
- 微信窗口最小化、隐藏或被关闭时工具均会自动恢复unhide → open -b 重开窗口 → AXMinimized=False → activate
- 运行时会占用微信前台操作
- 建议在专用电脑上运行

View File

@ -36,6 +36,9 @@ filter:
- "腾讯新闻"
- "微信支付"
- "微信团队"
- "服务号"
- "订阅号"
- "文件传输助手"
# 媒体处理
media:

View File

@ -102,6 +102,11 @@
- [x] **修复: UNKNOWN 状态长时间无法恢复** — 原恢复逻辑只做 activate + 点侧边栏,遇到弹窗/多余窗口无法清理。改为先 Escape + Cmd+W 关闭可能的弹窗,再 activate + 点侧边栏
- [x] **改进: 恢复失败指数退避** — 外层循环连续恢复失败时退避等待10s → 20s → 40s → 80s → 120s封顶避免每 13 秒重复无效尝试。恢复成功后计数器归零
### v0.9.3 窗口关闭恢复 (2026/04/24)
- [x] **修复: 窗口被关闭(非最小化)时无法恢复** — 微信进程在运行但 AXWindows=0窗口被关闭而非最小化原 unhide/AXMinimized=False/activate 均无效。新增策略:检测到 0 窗口时通过 `subprocess.run(["open", "-b", bundle_id])` 重新打开微信窗口
- [x] **窗口恢复策略升级为 4 层** — unhide隐藏→ 检测 0 窗口时 open -b 重开(关闭)→ AXMinimized=False最小化→ activate前台
### 待验证
- [x] ~~验证最小化窗口自动恢复功能(需手动最小化微信窗口测试)~~

View File

@ -5,6 +5,7 @@
import logging
import re
import subprocess
import time
from ApplicationServices import (
@ -129,11 +130,23 @@ class AXBridge:
app_ref = self.get_app_ref(bundle_id)
if app_ref:
windows = self.get_windows(app_ref)
for win in windows:
if self.is_window_minimized(win):
title = self.get_title(win) or "?"
logger.info(f"通过 AX API 取消窗口最小化: {title}")
self.set_window_minimized(win, False)
if not windows:
# 窗口被关闭(不是最小化),通过 open 命令重新打开
logger.info(f"{app_name} 没有窗口(已被关闭),通过 open 命令重新打开...")
try:
subprocess.run(
["open", "-b", bundle_id],
capture_output=True, timeout=5,
)
time.sleep(1.5)
except Exception as e:
logger.error(f"open 命令失败: {e}")
else:
for win in windows:
if self.is_window_minimized(win):
title = self.get_title(win) or "?"
logger.info(f"通过 AX API 取消窗口最小化: {title}")
self.set_window_minimized(win, False)
time.sleep(0.5)
# 策略3: activate 带到前台

View File

@ -35,7 +35,7 @@ DEFAULTS = {
"filter": {
"mode": "all",
"whitelist": [],
"blacklist": ["腾讯新闻", "微信支付", "微信团队"],
"blacklist": ["腾讯新闻", "微信支付", "微信团队", "服务号", "订阅号", "文件传输助手"],
},
"media": {
"click_images": True,