修复QQ抓联系人列表+微信自动回复错发给QQ+重复处理\n\n问题1: QQ/TIM抓会话列表而非消息\n 根因: _click_message_area单次点击(width*0.88)落在联系人/群列表\n 而非消息显示区,导致Ctrl+A复制联系人名而非消息内容\n 修复: _focus_message_area两次SendMessage点击\n 先点会话列表(左15%)选对话→再点消息区(中右60%)聚焦消息\n + Esc前导键退出搜索模式\n\n问题2: 微信自动回复发给QQ\n 根因: _attach_set_foreground静默失败不返回结果\n SendKeys输入到当前前台窗口(QQ)\n 修复: _ensure_foreground使用GetForegroundWindow验证\n 确认目标窗口真正在前台,失败则return False放弃发送\n + 处理托盘/最小化窗口(ShowWindow SW_SHOWNORMAL)\n\n问题3: 重复处理同1条消息\n 根因: QQ每次读到不同联系人名=不同新消息=反复触发\n 修复: ①聚焦消息区后读到稳定消息内容 ②_sending_event锁\n 自动回复发送期间阻止监控轮询,避免焦点被抢\n\n其他: _ensure_hwnd检测QQ NT vs TIM变体\n 用于选择UIA优先或剪贴板优先策略

This commit is contained in:
youpaishidifu
2026-07-25 14:37:54 +08:00
parent cb170d1160
commit 0322e2af64
2 changed files with 121 additions and 45 deletions
+17 -12
View File
@@ -361,22 +361,27 @@ class MsgBotApp(ctk.CTk):
self.after(200, self._flush_reply_queue)
def _execute_reply(self, data: dict):
"""主线程执行自动回复发送。"""
"""主线程执行自动回复发送。加上发送锁防止监控轮询干扰。"""
platform = data["platform"]
answer = data["answer"]
sender = data.get("sender")
if sender:
# 搜索联系人切换会话
found = self.monitor._search_contact(platform, sender)
if not found:
self._log(f"[{platform}] ⚠ 找不到联系人 {sender},当前会话回复")
# 发送(主线程 SetForegroundWindow 可靠)
ok = self.monitor._paste_and_send(platform, answer)
if ok:
self._log(f"[{platform}] 🤖 已自动回复: {answer[:60]}...")
else:
self._log(f"[{platform}] ⚠ 自动回复发送失败")
# 设发送锁,阻止监控轮询切走焦点
self.monitor._sending_event.set()
try:
if sender:
# 搜索联系人切换会话
found = self.monitor._search_contact(platform, sender)
if not found:
self._log(f"[{platform}] ⚠ 找不到联系人 {sender},当前会话回复")
# 发送(主线程 SetForegroundWindow 可靠,且不受监控干扰)
ok = self.monitor._paste_and_send(platform, answer)
if ok:
self._log(f"[{platform}] 🤖 已自动回复: {answer[:60]}...")
else:
self._log(f"[{platform}] ⚠ 自动回复发送失败(目标窗口无法带到前台)")
finally:
self.monitor._sending_event.clear()
def _clear_log(self):
self._log_text.configure(state="normal")