Получить выделенный текст из другого приложения в собственное приложение С#

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

Я протестировал родной Win32 Api, затем SendKeys (CTRL + C, буфер обмена,...), а теперь Microsoft UI Automation! Проблема в том, что это работает только в Блокноте, но не в Internet Explorer, Word или других приложениях.

Я думаю, что должно быть лучшее решение, чем код, который у меня есть. Я читал, что отправка CTRL + C должна работать нормально, но это работает только в Блокноте.

Вот метод, который я вызываю, когда срабатывает глобальная горячая клавиша:

    public String GetSelectedTextFromApp()
    {
        String output = "";
        AutomationElement focused = AutomationElement.FocusedElement;
        object pattern;
        TextPatternRange[] trs;
        if (focused.TryGetCurrentPattern(TextPattern.Pattern, out pattern))
        {
            TextPattern tp = (TextPattern)pattern;
            trs = tp.GetSelection();
            output = trs[0].GetText(-1);
        }
        return output;
    }

person user2564598    schedule 09.07.2013    source источник
comment
Проверьте типы элементов управления, из которых вы хотите скопировать выделение в MS Word и IE — это могут быть нестандартные элементы управления, которые не являются поддерживается автоматизацией пользовательского интерфейса.   -  person Andrii Kalytiiuk    schedule 09.07.2013


Ответы (1)


Элемент управления, который вы пытаетесь автоматизировать, может не реализовывать TextPattern. Он может реализовать только ValuePattern. Кроме того, возможно, что элемент управления, на котором вы сосредоточены, не является элементом управления, который на самом деле содержит текст, а скорее элементом управления-оберткой, под которым вы найдете AutomationElement, реализующий вышеупомянутые шаблоны. Другая возможность, как сказал Андрей, состоит в том, что управление вообще не поддерживает UIA (хотя мне трудно поверить в случае с MS Word).

В таких случаях стоит работать с UISpy.exe, который поможет вам увидеть визуальное дерево приложения, которое вы пытаетесь автоматизировать. Вы также сможете увидеть поддерживаемые Pattern для каждого AutomationElement. Вы также можете вызвать GetSupportedPatterns() для каждого AutomationElement, чтобы увидеть, какие Pattern поддерживаются в настоящее время.

person Tal Bronfer    schedule 10.07.2013