优化主窗口寻找

This commit is contained in:
cris 2026-04-24 17:27:16 +08:00
parent 1468b26436
commit 1f3cbaa0f9
4 changed files with 22 additions and 3 deletions

View File

@ -42,6 +42,7 @@ wechat_clicker/
- 可见性检查基于元素**中心点**是否在消息列表可见区域内30px margin - 可见性检查基于元素**中心点**是否在消息列表可见区域内30px margin
- 状态检测基于窗口计数 + **AXMinimized 属性**:区分窗口存在但最小化 vs 真正可见 - 状态检测基于窗口计数 + **AXMinimized 属性**:区分窗口存在但最小化 vs 真正可见
- **窗口恢复策略**NSRunningApplication.unhide隐藏→ AX API 设置 AXMinimized=False最小化→ activate前台AppleScript 不可靠(微信不支持 miniaturized 属性) - **窗口恢复策略**NSRunningApplication.unhide隐藏→ AX API 设置 AXMinimized=False最小化→ activate前台AppleScript 不可靠(微信不支持 miniaturized 属性)
- **UNKNOWN 状态恢复**:先 Escape + Cmd+W 关闭可能的弹窗/多余窗口,再 activate + 点击侧边栏外层循环连续恢复失败时指数退避10s → 20s → 40s → ... → 120s 封顶),避免无效高频重试
## 使用方法 ## 使用方法

View File

@ -97,6 +97,11 @@
- [x] **新增: 每聊天图片处理上限**`MAX_IMAGES_PER_CHAT = 30`防止单个高活跃群聊垄断处理时间30张×10s = 5分钟/聊天) - [x] **新增: 每聊天图片处理上限**`MAX_IMAGES_PER_CHAT = 30`防止单个高活跃群聊垄断处理时间30张×10s = 5分钟/聊天)
- [x] **简化: `_process_media_with_scroll`** — 不再负责滚动和锚点查找(移入 `_process_images_with_arrow` 内部),代码更清晰 - [x] **简化: `_process_media_with_scroll`** — 不再负责滚动和锚点查找(移入 `_process_images_with_arrow` 内部),代码更清晰
### v0.9.2 UNKNOWN 状态恢复加固 (2026/04/24)
- [x] **修复: UNKNOWN 状态长时间无法恢复** — 原恢复逻辑只做 activate + 点侧边栏,遇到弹窗/多余窗口无法清理。改为先 Escape + Cmd+W 关闭可能的弹窗,再 activate + 点侧边栏
- [x] **改进: 恢复失败指数退避** — 外层循环连续恢复失败时退避等待10s → 20s → 40s → 80s → 120s封顶避免每 13 秒重复无效尝试。恢复成功后计数器归零
### 待验证 ### 待验证
- [x] ~~验证最小化窗口自动恢复功能(需手动最小化微信窗口测试)~~ - [x] ~~验证最小化窗口自动恢复功能(需手动最小化微信窗口测试)~~

View File

@ -39,6 +39,7 @@ class WeChatAutomator:
self._scan_count = 0 self._scan_count = 0
self._total_chats_processed = 0 self._total_chats_processed = 0
self._total_media_clicked = 0 self._total_media_clicked = 0
self._consecutive_recover_failures = 0
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# 启动检查 # 启动检查
@ -114,10 +115,17 @@ class WeChatAutomator:
time.sleep(0.5) time.sleep(0.5)
if not self.state.recover_to_chat_list(): if not self.state.recover_to_chat_list():
logger.warning("无法恢复到聊天列表,跳过本次循环") self._consecutive_recover_failures += 1
time.sleep(10) backoff = min(10 * (2 ** (self._consecutive_recover_failures - 1)), 120)
logger.warning(
f"无法恢复到聊天列表 (连续失败 {self._consecutive_recover_failures}), "
f"等待 {backoff}s"
)
time.sleep(backoff)
return return
self._consecutive_recover_failures = 0
self._scan_count += 1 self._scan_count += 1
global_unread = self.ui.get_global_unread_count() global_unread = self.ui.get_global_unread_count()

View File

@ -154,7 +154,12 @@ class StateMachine:
time.sleep(0.5) time.sleep(0.5)
if state == UIState.UNKNOWN: if state == UIState.UNKNOWN:
# 尝试激活微信并点击侧边栏聊天按钮 # 先尝试关闭可能的弹窗/多余窗口
self.ax.send_escape_key()
time.sleep(0.3)
self.ax.send_cmd_w()
time.sleep(0.3)
# 重新激活微信并点击侧边栏聊天按钮
self.ui.ensure_wechat_frontmost() self.ui.ensure_wechat_frontmost()
time.sleep(0.5) time.sleep(0.5)
self.ui.click_sidebar_chat_tab() self.ui.click_sidebar_chat_tab()