You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.5 KiB
103 lines
3.5 KiB
"""会话列表操作"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
import time
|
|
|
|
import uiautomation as uia
|
|
|
|
from ..config import Config
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ConversationList:
|
|
"""操作微信左侧会话列表"""
|
|
|
|
def __init__(self, window: uia.WindowControl, config: Config) -> None:
|
|
self._window = window
|
|
self.config = config
|
|
self._list: uia.ListControl | None = None
|
|
|
|
# ------------------------------------------------------------------
|
|
# 初始化面板
|
|
# ------------------------------------------------------------------
|
|
|
|
def _ensure_list(self) -> uia.ListControl | None:
|
|
if self._list is not None and self._list.Exists(maxSearchSeconds=0.5):
|
|
return self._list
|
|
try:
|
|
# 微信会话列表通常是一个 ListControl
|
|
# 通过搜索树定位第一个 ListControl
|
|
lst = self._window.ListControl(searchDepth=8)
|
|
if lst.Exists(maxSearchSeconds=2):
|
|
self._list = lst
|
|
return lst
|
|
except Exception:
|
|
logger.debug("定位会话列表失败")
|
|
return None
|
|
|
|
# ------------------------------------------------------------------
|
|
# 公开方法
|
|
# ------------------------------------------------------------------
|
|
|
|
def get_items(self) -> list[uia.Control]:
|
|
"""返回会话列表中的所有会话项"""
|
|
lst = self._ensure_list()
|
|
if lst is None:
|
|
return []
|
|
try:
|
|
return lst.GetChildren()
|
|
except Exception:
|
|
logger.exception("获取会话列表项失败")
|
|
return []
|
|
|
|
def get_current_conversation_name(self) -> str:
|
|
"""获取当前激活的会话名称(聊天窗口顶部标题)"""
|
|
try:
|
|
# 聊聊窗口标题区域
|
|
edit = self._window.EditControl(searchDepth=8)
|
|
if edit.Exists(maxSearchSeconds=1):
|
|
return edit.Name or ""
|
|
except Exception:
|
|
pass
|
|
return ""
|
|
|
|
def click_conversation(self, name: str) -> bool:
|
|
"""点击指定名称的会话"""
|
|
lst = self._ensure_list()
|
|
if lst is None:
|
|
return False
|
|
try:
|
|
for item in lst.GetChildren():
|
|
if name in (item.Name or ""):
|
|
item.Click()
|
|
time.sleep(0.5)
|
|
logger.info("已切换到会话: %s", name)
|
|
return True
|
|
except Exception:
|
|
logger.exception("点击会话失败: %s", name)
|
|
logger.warning("未找到会话: %s", name)
|
|
return False
|
|
|
|
def search_conversation(self, keyword: str) -> bool:
|
|
"""通过搜索框定位会话"""
|
|
try:
|
|
search_edit = self._window.EditControl(Name="搜索", searchDepth=8)
|
|
if not search_edit.Exists(maxSearchSeconds=2):
|
|
search_edit = self._window.EditControl(searchDepth=3)
|
|
if search_edit.Exists(maxSearchSeconds=1):
|
|
search_edit.Click()
|
|
time.sleep(0.3)
|
|
search_edit.SendKeys(keyword, interval=0.05)
|
|
time.sleep(1.0)
|
|
# 点击第一个搜索结果
|
|
result = self._window.ListItemControl(searchDepth=8)
|
|
if result.Exists(maxSearchSeconds=2):
|
|
result.Click()
|
|
time.sleep(0.5)
|
|
return True
|
|
except Exception:
|
|
logger.exception("搜索会话失败: %s", keyword)
|
|
return False
|
|
|