namespace WxAgent.Core; public static class WechatLocators { public const string MainView = "MainView"; public const string MainTabBar = "MainView.main_tabbar"; public const string SettingsMenuButton = "MainView.main_tabbar.tabbar_setting"; public const string PreferenceWindow = "PreferenceWindow"; public const string ProfileWindowTitle = "Weixin"; public const string ProfileDisplayName = "right_v_view.nickname_button_view.display_name_text"; public const string ProfileWechatId = "right_v_view.user_info_center_view.basic_line_view.ProfileTextView"; // Observed with WeChat 4.1.13.63; query its public shell icon metadata, never post tray callback messages. public const string TrayMessageWindowClass = "Qt51514WxTrayIconMessageWindowClass"; public const uint TrayIconId = 0; public static bool IsNotificationAreaRoot(string className) => className is "Shell_TrayWnd" or "Shell_SecondaryTrayWnd" or "NotifyIconOverflowWindow"; public static bool IsWechatTrayName(string name) => name is "微信" or "WeChat" or "Weixin" || name.StartsWith("微信\n", StringComparison.Ordinal) || name.StartsWith("微信\r", StringComparison.Ordinal); public static bool IsNativeMainWindow(string className, string title) => title == "微信" && className.StartsWith("Qt", StringComparison.Ordinal) && className.EndsWith("QWindowIcon", StringComparison.Ordinal); public const string SessionList = "session_list"; public const string ChatPage = "chat_message_page"; public const string MessageList = "chat_message_list"; public const string ChatInput = "chat_input_field"; public const string MentionPopover = "MentionPopover"; public const string MentionList = "chat_mention_list"; public const string ToolBar = "tool_bar_accessible"; public const string CurrentChatName = "content_view.top_content_view.title_h_view.left_v_view.left_content_v_view.left_ui_.big_title_line_h_view.current_chat_name_label"; public const string ChatBubbleItem = "chat_message_list.qt_scrollarea_viewport.chat_bubble_item_view"; public const string FileTransferAssistant = "文件传输助手"; public const string Search = "搜索"; public const string SearchList = "search_list"; public const string Send = "发送"; public const string FileTransferAssistantSearchResult = "search_item_function_文件传输助手"; public static IReadOnlyList RequiredAutomationIds { get; } = [MainView, SessionList, ChatPage, MessageList, ChatInput, ToolBar]; public static WxAgentErrorCode? ClassifyFoundWindow(IReadOnlyDictionary controls) { if (controls.Values.All(found => !found)) { return WxAgentErrorCode.WechatNotLoggedIn; } if (!controls.GetValueOrDefault(MainView) || !controls.GetValueOrDefault(SessionList)) { return WxAgentErrorCode.UiStructureChanged; } var chatControls = new[] { ChatPage, MessageList, ChatInput, ToolBar }; var visibleChatControls = chatControls.Count(id => controls.GetValueOrDefault(id)); return visibleChatControls is 0 or 4 ? null : WxAgentErrorCode.UiStructureChanged; } }