MS UI Automation — как получить текст из ControlType.text

У меня есть небольшое приложение для Windows, на котором есть ряд меток. Это приложение будет глобальным, и есть вероятность, что текст на этих этикетках может быть усечен. Я пытаюсь автоматизировать определение усеченного текста на этих этикетках.

Для других элементов управления я могу использовать TextPattern.Pattern, с помощью которого я могу найти видимый текст и фактический текст внутри элемента управления. Но для меток (ControlType.text) TextPattern не поддерживается. Как найти видимый текст для этих ярлыков с помощью автоматизации пользовательского интерфейса.

Вот код, который я пробовал. Если я передаю тип управления как Document, он работает. Но с типом элемента управления Text это дает исключение неподдерживаемого шаблона.

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;
        }

person Virus    schedule 09.09.2015    source источник


Ответы (2)


То, поддерживается ли текстовый шаблон элементом метки, зависит от того, какая структура пользовательского интерфейса используется. Например, метки в Win32 Run dlg не поддерживают шаблон Text, но метки в калькуляторе XAML Windows 10 поддерживают. На изображении ниже показано, как инструмент Inspect SDK сообщает, что шаблон Text поддерживается ярлыком «Истории еще нет».

Важно отметить, что включает ли инфраструктура пользовательского интерфейса (или приложение, если приложение реализует текстовый шаблон UIA напрямую) усеченный текст в данные, которые она возвращает вам при вызове IUIAutomationTextPattern::GetVisibleRanges(), зависит от платформы ( или приложение). Например, WordPad, работающий в Windows 10, не включает обрезанный текст, но Word 2013 возвращает обрезанный текст.

Спасибо,

Парень

введите здесь описание изображения

person Guy Barker - Microsoft    schedule 15.09.2015

Вы должны иметь возможность просто использовать element.Current.Name (элемент является экземпляром AutomationElement для метки).

Вот пример UISpy, извлекающий текст для метки:

введите здесь описание изображения

person Simon Mourier    schedule 10.09.2015
comment
Да, верно. Но это дает мне весь текст независимо от того, какой текст виден. Если текст усечен, я бы хотел получить только видимый текст. - person Virus; 10.09.2015
comment
Я не думаю, что это возможно легко - person Simon Mourier; 10.09.2015
comment
В порядке! Это работает для других элементов управления, таких как «Редактировать» и «Документ». Мы можем легко получить только видимый текст. Но для управления метками, кажется, нет способа сделать это. - person Virus; 10.09.2015