技术实现:
  1. 通过实时监听聊天面板,通过消息主题,时间等关键信息比对,发现如果有信息到达,则进行下一步逻辑处理。
  2. 有新消息达到,则自动点击新消息的联系人UI对象,切换到与联系人的聊天窗口。
  3. 获取聊天窗口的最后一条消息对象,如果发现Name中包含[文件]关键字则进行下一步逻辑。
  4.  消息对象中包括了文件名称,大小,发送人等信息,将他们提取出来。
  5. 开启一个任务监听微信的文件夹,分析是否完成了下载归档操作。
代码片段:

微信是否产生新消息

var currentChatList = UI_WX_Window.Current.Find("/Pane/Pane[1]/Pane[2]/Pane/Pane/Pane/List");
 if (currentChatList == null || currentChatList.ControlType != FlaUI.Core.Definitions.ControlType.List)
 {
     Thread.Sleep(1000);
     continue;
 }
 var source = currentChatList.FindAllChildren();
 var tempMessageSource = new List<WXFileMsgEntity>();
 source.ToList().ForEach(item =>
 {
     if (item.ControlType == FlaUI.Core.Definitions.ControlType.ListItem)
     {
         var buttonName = item.FindFirstByXPath("/Pane/Button")?.Name;
         var time = item.FindFirstByXPath("/Pane/Pane/Pane[1]/Text[2]")?.Name;
         var lastMessage = item.FindFirstByXPath("/Pane/Pane/Pane[2]/Text")?.Name;
         var count = item.FindFirstByXPath("/Pane/Text")?.Name;

         var messageitem = new WXFileMsgEntity { UserName = buttonName, Time = time, CurrentMessage = lastMessage, Count = count };
         tempMessageSource.Add(messageitem); 
         if (historyMessageSource != null)
         {
             var cnt = historyMessageSource.Count(s =>
             s.UserName == messageitem.UserName
             && s.CurrentMessage == messageitem.CurrentMessage
             && s.Time == messageitem.Time);
             if (cnt == 0)
             {
                 if (GetFileUsers.Count(ss => ss.Contains(messageitem.UserName)) > 0)
                 {
                     //切换窗口
                     UI_WX_Window.Current.ClickElement(item);
                     Thread.Sleep(200);
                     GetFile(messageitem);
                 }
             }
         }
     }
 });
 historyMessageSource = tempMessageSource;
 Thread.Sleep(1000);

获取文件信息

private void GetFile(WXFileMsgEntity messageitem)
  {
      var chatHistoryList = UI_WX_Window.Current.Find("/Pane/Pane[2]/Pane/Pane/Pane/Pane/Pane[2]/Pane[1]/Pane/List");//聊天窗口
      if (chatHistoryList != null)
      {
          var source = chatHistoryList.FindAllChildren();
          int i = source.Count() - 1;
          var currentUI = source[i];
          var name = currentUI.Name;
          if (name.Contains("[文件]"))
          {
              var userName = currentUI.FindFirstByXPath("/Pane/Button");
              var fileName = currentUI.FindFirstByXPath("/Pane/Pane[1]/Pane/Pane/Pane/Pane/Pane[1]/Pane[1]/Text");
              var fileSize = currentUI.FindFirstByXPath("/Pane/Pane[1]/Pane/Pane/Pane/Pane/Pane[1]/Pane[1]/Pane/Text[1]");
              if (userName != null && fileName != null && fileSize != null)
              {
                  messageitem.FileName = fileName.Name;

                  messageitem.FileSize = fileSize.Name;

                  string absPath = "E:\\AppFiles\\WeChat Files\\WeChat Files\\wxid_bwalm3wpwz8o22\\FileStorage\\File\\" + DateTime.Now.ToString("yyyy-MM");

                  messageitem.FullFile = absPath + "\\" + messageitem.FileName;

                  SetMessage(messageitem.UserName + "有新文件传送给你,文件名:" + messageitem.FileName + " 尺寸:" + messageitem.FileSize + " 路径:" + messageitem.FullFile);

                  fileCheckSource.Add(messageitem);
              }
          }
      }
  }

文件是否归档 

Thread fileCheck = new Thread(new ThreadStart(() =>
            {
                while (State == TaskState.Runing)
                {
                    foreach (var item in fileCheckSource)
                    {
                        if (item.IsDownLoad == false) {

                            if (System.IO.File.Exists(item.FullFile))
                            {
                                SetMessage(item.UserName + "的文件【"+item.FileName+"】已成功归档本地 " );
                                item.IsDownLoad=true;
                            }
                        }
                    }
                
                    Thread.Sleep(1000);
                }
            }));
            fileCheck.Start();