修复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:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user