环境:windows11 64 位、Visual Studio 2022、.NET6.0
本系列文章仅用于学习winform及UI自动化技术,不涉及任何软件、程序破解,请勿用于非法用途
效果演示
`
抓取思路
先通过使用FlaUInspect分析下窗体元素结构:
我们可以根据“Text”关键字定位元素,进而提取到关键信息
核心代码
/// <summary>
/// 循环读取联系人
/// </summary>
/// <param name="action">每次读取到联系人</param>
/// <returns>完整的联系人集合</returns>
public List<Contacts> LoopReadContactsDetail(Action<Contacts> action)
{
List<Contacts> contacts = new List<Contacts>();
SwitchingModule(WeChatModuleEnums.AddressBook);
var list = GetContactsElement();
if (list != null)
{
var pattern = list.Patterns.Scroll.Pattern;
list.AsListBox().FindFirstChild(x => x.ByName("新的朋友")).Click();
double d = 0;
while (true)
{
if (d > 0 && d == pattern.VerticalScrollPercent.ValueOrDefault)
{
break;
}
else
{
d = pattern.VerticalScrollPercent.ValueOrDefault;
}
Keyboard.Type(VirtualKeyShort.DOWN);
Thread.Sleep(100);
Contacts? c = GetContactsDetail();
if (c != null)
{
action?.Invoke(c);
contacts.Add(c);
}
}
pattern.SetScrollPercent(1, 0);
}
return contacts.Distinct().Where(x => x != null).ToList();
}
/// <summary>
/// 切换到指定模块
/// </summary>
/// <param name="moduleEnum">目标模块</param>
/// <returns></returns>
public bool SwitchingModule(WeChatModuleEnums moduleEnum)
{
this.EnsureWindowVisibleAndFocused();
GetToolBar()?.FindChildAt((int)moduleEnum)?.Click();
switch (moduleEnum)
{
case WeChatModuleEnums.Chat:
{
var element = GetMainPanel()?.FindFirstByXPathSafe(weChatDriveConfig.NavbarChatXPath);
if (element != null)
{
element.Patterns.Scroll.Pattern.SetScrollPercent(1, 0);
return true;
}
else
{
log.Warn($"{weChatDriveConfig.NavbarChatXPath}未找到");
}
return false;
}
case WeChatModuleEnums.AddressBook:
{
var element = GetMainPanel()?.FindFirstByXPathSafe(weChatDriveConfig.NavbarContactsXPath);
if (element != null)
{
element.Patterns.Scroll.Pattern.SetScrollPercent(1, 0);
return true;
}
else
{
log.Warn($"{weChatDriveConfig.NavbarContactsXPath}未找到");
}
return false;
}
default:
break;
}
return false;
}
/// <summary>
/// 读取联系人详情信息
/// </summary>
public Contacts? GetContactsDetail()
{
AutomationElement? element = GetMainPanel();
if (element == null)
{
return null;
}
if (element.FindFirstDescendant(x => x.ByName("微信号:")) == null)
{
return null;
}
Contacts contacts = new Contacts();
contacts.Nickname = ReadTextNextText(element, "昵称:");
contacts.WeChatId = ReadTextNextText(element, "微信号:");
contacts.Label = ReadTextNextText(element, "标签");
contacts.Remark = ReadTextNextText(element, "备注");
contacts.Phone = ReadTextNextText(element, "电话");
contacts.Area = ReadTextNextText(element, "地区:");
contacts.Source = ReadTextNextText(element, "来源");
contacts.PersonalSignature = ReadTextNextText(element, "个性签名");
return contacts;
}
沟通交流
欢迎评论、私信。