C# MS UI自动化-如何从ControlType.text获取文本

C# MS UI自动化-如何从ControlType.text获取文本,c#,automation,ui-automation,microsoft-ui-automation,C#,Automation,Ui Automation,Microsoft Ui Automation,我有一个小的windows应用程序,上面有一系列标签。此应用程序将全球化,并且这些标签上的文本可能会被截断。我正在尝试自动识别这些标签上的截断文本 对于其他控件,我可以使用TextPattern.Pattern,通过它我可以找到控件中的可见文本和实际文本。但是对于标签(ControlType.text),不支持TextPattern。如何使用UI自动化查找这些标签的可见文本 这是我试过的代码。如果我将控件类型作为文档传递,它将工作。但对于文本控件类型,它会给出一个不受支持的模式异常 privat

我有一个小的windows应用程序,上面有一系列标签。此应用程序将全球化,并且这些标签上的文本可能会被截断。我正在尝试自动识别这些标签上的截断文本

对于其他控件,我可以使用TextPattern.Pattern,通过它我可以找到控件中的可见文本和实际文本。但是对于标签(ControlType.text),不支持TextPattern。如何使用UI自动化查找这些标签的可见文本

这是我试过的代码。如果我将控件类型作为文档传递,它将工作。但对于文本控件类型,它会给出一个不受支持的模式异常

private String TextFromSelection(AutomationElement target, Int32 length)
        {
            // Specify the control type we're looking for, in this case 'Document'
            PropertyCondition cond = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Text);

            // target --> The root AutomationElement.
            AutomationElement textProvider = target.FindFirst(TreeScope.Descendants, cond);

            TextPattern textpatternPattern = textProvider.GetCurrentPattern(TextPattern.Pattern) as TextPattern;

            if (textpatternPattern == null)
            {
                Console.WriteLine("Root element does not contain a descendant that supports TextPattern.");
                return null;
            }


            var test = textpatternPattern.DocumentRange.GetText(-1).TrimEnd('\r');

            var tpr = textpatternPattern.GetVisibleRanges();
            var txt = tpr[0].GetText(-1);

            return txt;
        }

您应该能够简单地使用
元素.Current.Name
(元素是标签的AutomationElement实例)

以下是UISpy检索标签文本的示例:


标签元素是否支持文本模式将受使用的UI框架的影响。例如,Win32 Run dlg中的标签不支持文本模式,但Windows 10 XAML计算器中的标签支持文本模式。下图显示了Inspect SDK工具,该工具报告“还没有历史记录”标签支持文本模式

需要注意的是,UI框架(如果应用程序直接实现UIA文本模式,则应用程序)是否在调用IUIAutomationTextPattern::GetVisibleRanges()时返回给您的数据中包含截断的文本,这取决于框架(或应用程序)本身。例如,在Windows 10上运行的写字板不包含从视图中剪切掉的文本,但Word 2013会返回剪切掉的文本

谢谢

家伙


是的,没错。但这给了我整个文本,不管什么文本是可见的。如果文本被截断,我只想获取可见的文本。我不认为这是可能的!这适用于其他控件,如编辑和文档。我们可以很容易地只获得可见的文本。但对于标签控制,似乎没有办法做到这一点。