【问题标题】:C# System.Windows.Automation get element textC# System.Windows.Automation 获取元素文本
【发布时间】:2014-07-14 01:11:45
【问题描述】:

我正在尝试使用 C# 中的自动化从应用程序控件中获取文本/标签。

到目前为止,我可以使用此功能获得应用程序的 AutomationElement 树(例如记事本):

    private void WalkControlElements(AutomationElement rootElement, TreeNode treeNode)
    {
        AutomationElement elementNode = TreeWalker.ContentViewWalker.GetFirstChild(rootElement);;

        while (elementNode != null)
        {
            TreeNode childTreeNode = treeNode.Nodes.Add(elementNode.Current.ControlType.LocalizedControlType);

            // here I want to get text from 'elementNode'

            WalkControlElements(elementNode, childTreeNode);
            elementNode = TreeWalker.ControlViewWalker.GetNextSibling(elementNode);
        }
    }

我尝试关注这篇文章http://msdn.microsoft.com/en-us/library/ms788751(v=vs.110).aspx,但它只能获取文本属性,如字体名称、字体粗细等。

谁能指出正确的程序如何使用自动化获取元素文本?

【问题讨论】:

    标签: c# ui-automation


    【解决方案1】:

    Mike Zboray 的回答效果很好。如果您可以访问模式匹配,这里是相同的(精简)代码:

    public static class AutomationExtensions
    {
        public static string GetText(this AutomationElement element)
        => element.TryGetCurrentPattern(ValuePattern.Pattern, out object patternValue) ? ((ValuePattern)patternValue).Current.Value
            : element.TryGetCurrentPattern(TextPattern.Pattern, out object patternText) ? ((TextPattern)patternText).DocumentRange.GetText(-1).TrimEnd('\r') // often there is an extra '\r' hanging off the end.
            : element.Current.Name;
    }
    

    【讨论】:

      【解决方案2】:

      该示例向您展示了如何获取 文本属性,即有关 UI 中文本显示的信息,而不是实际显示的文本。为一般应用程序获取所有实际显示的文本可能比它最初出现时更困难。

      由于有多种获取文本的方式,并且应用程序和控件的支持不一致,这使得这变得困难。有两种模式有用,ValuePatternTextPattern。按照惯例,Name 属性包含向用户显示的文本,但对此的遵守是不一致的。下面是我在 UI 自动化中用于测试的辅助方法。它基本上会通过这些模式检查控件的支持并回退到名称。

      public static class AutomationExtensions
      {
          public static string GetText(this AutomationElement element)
          {
              object patternObj;
              if (element.TryGetCurrentPattern(ValuePattern.Pattern, out patternObj))
              {
                  var valuePattern = (ValuePattern)patternObj;
                  return valuePattern.Current.Value;
              }
              else if (element.TryGetCurrentPattern(TextPattern.Pattern, out patternObj))
              {
                  var textPattern = (TextPattern)patternObj;
                  return textPattern.DocumentRange.GetText(-1).TrimEnd('\r'); // often there is an extra '\r' hanging off the end.
              }
              else
              {
                  return element.Current.Name;
              }
          }
      }
      

      这负责从标签、文本框(普通文本框和富文本框)和按钮等简单控件中获取文本。像列表框和组合框(尤其是在 WPF 中)这样的控件可能会更狡猾,因为它们的项目可以被虚拟化,因此在用户与它们交互之前它们可能不存在于自动化树中。您可能希望仅在某些 UI 自动化控件类型(如您知道包含文本的 Edit、Text 和 Document)上过滤和调用此方法。

      【讨论】:

      • 谢谢它的工作。就在第 3 行,您在双“静态”关键字中有错误,我认为第二个应该是“字符串”。在第 6 行,您在行尾缺少右括号。
      猜你喜欢
      • 2018-11-08
      • 1970-01-01
      • 2013-05-12
      • 2021-03-25
      • 2014-12-09
      • 2018-04-20
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多