You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FLAUI中查找名称以指定字符开头或包含指定字符的子元素并关联Office文件窗口

解决FlaUI中按名称开头/包含特定字符定位窗口的问题

我刚好之前做过类似的FlaUI自动化Office文件的场景,来帮你搞定这个定位问题!

FlaUI的FindFirstChild默认的ByName是精确匹配,但我们可以用它内置的通配符支持或者自定义条件来实现开头/包含的匹配逻辑,下面分两种方案给你讲解:

方案1:用ByNameLike(通配符匹配)

FlaUI的ConditionFactory提供了ByNameLike方法,支持用*作为通配符:

  • *DOC*:匹配名称包含"DOC"的元素
  • DOC*:匹配名称以"DOC"开头的元素

如果要同时匹配多个关键词(比如DOC/PPT/XLS/TXT),可以用Or把多个条件组合起来。修改你的代码如下:

// 把Automation实例提到循环外,避免重复创建
var automation = new UIA3Automation();
foreach (var file in listOfFiles) { 
    if (file.Name.Contains("DOC") || file.Name.Contains("PPT") || file.Name.Contains("XLS") || file.Name.Contains("TXT")) { 
        file.AsButton().Invoke(); 
        var desktopWindow = automation.GetDesktop(); 
        // 等待窗口出现,匹配名称包含DOC/PPT/XLS/TXT的窗口
        desktopWindow = WaitForElement(() => desktopWindow.FindFirstChild(cr => 
            cr.ByNameLike("*DOC*")
            .Or(cr.ByNameLike("*PPT*"))
            .Or(cr.ByNameLike("*XLS*"))
            .Or(cr.ByNameLike("*TXT*"))
        )); 
        var app = FlaUI.Core.Application.Attach(desktopWindow.Properties.ProcessId); 
        var application = app.GetMainWindow(automation); 
        CloseingProcess(application.Name); 
    }
}

方案2:自定义PropertyCondition(更灵活的匹配)

如果你需要更精确的控制(比如严格的开头匹配,而不是通配符),可以直接使用PropertyCondition结合PropertyConditionOperator:

  • PropertyConditionOperator.BeginsWith:匹配名称以指定字符串开头的元素
  • PropertyConditionOperator.Contains:匹配名称包含指定字符串的元素

同样用OrCondition组合多个条件,代码示例:

var automation = new UIA3Automation();
foreach (var file in listOfFiles) { 
    if (file.Name.Contains("DOC") || file.Name.Contains("PPT") || file.Name.Contains("XLS") || file.Name.Contains("TXT")) { 
        file.AsButton().Invoke(); 
        var desktopWindow = automation.GetDesktop(); 
        // 构建多个条件:名称以DOC/PPT/XLS/TXT开头,或者包含这些字符串(根据你的需求选一种)
        var condition = new OrCondition(
            new PropertyCondition(AutomationElement.NameProperty, "DOC", PropertyConditionOperator.BeginsWith),
            new PropertyCondition(AutomationElement.NameProperty, "PPT", PropertyConditionOperator.BeginsWith),
            new PropertyCondition(AutomationElement.NameProperty, "XLS", PropertyConditionOperator.BeginsWith),
            new PropertyCondition(AutomationElement.NameProperty, "TXT", PropertyConditionOperator.BeginsWith)
            // 如果要改成包含,把BeginsWith换成Contains即可
        );
        // 等待窗口出现
        desktopWindow = WaitForElement(() => desktopWindow.FindFirstChild(condition)); 
        var app = FlaUI.Core.Application.Attach(desktopWindow.Properties.ProcessId); 
        var application = app.GetMainWindow(automation); 
        CloseingProcess(application.Name); 
    }
}

注意事项

  1. 避免重复创建Automation实例:把UIA3Automation的创建移到循环外面,减少资源开销。
  2. WaitForElement的超时:如果你的WaitForElement方法支持设置超时时间,建议加上,避免无限等待(比如WaitForElement(..., timeout: TimeSpan.FromSeconds(10)))。
  3. 窗口名称的准确性:Office文件打开后的窗口名称通常是“文件名 - 软件名”(比如“test.docx - Word”),所以用*DOC*或者BeginsWith("test.docx")都能匹配,根据你的实际需求调整。

内容的提问来源于stack exchange,提问作者phux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:02:40