2010-11-22 1 views
7

У меня есть небольшое приложение для лотков, которое регистрирует горячую клавишу в системе. Когда пользователь выбирает текст в любом месте любого приложения и нажимает эту горячую клавишу, я хочу иметь возможность захватить выделенный текст. Я сейчас делаю это с помощью AutomationElements:Как получить выделенный текст из ЛЮБОГО окна (с использованием автоматизации пользовательского интерфейса) - C#

//Using FocusedElement (since the focused element should be the control with the selected text?) 
AutomationElement ae = AutomationElement.FocusedElement;   
AutomationElement txtElement = ae.FindFirst(TreeScope.Subtree,Condition.TrueCondition); 
if(txtElement == null) 
    return; 

TextPattern tp; 

try 
{ 
    tp = txtElement.GetCurrentPattern(TextPattern.Pattern) as TextPattern; 
} 
catch(Exception ex) 
{ 
    return; 
} 

TextPatternRange[] trs; 

if (tp.SupportedTextSelection == SupportedTextSelection.None) 
{ 
    return; 
      } 
else 
{ 
    trs = tp.GetSelection(); 
    string selectedText = trs[0].GetText(-1); 
    MessageBox.Show(selectedText); 

} 

Это работает для некоторых приложений (например, блокнота, визуальные студии окна редактирования и такие), но не для всех (например, Word, FireFox, Chrome, и так далее.)

Кто-нибудь здесь с любыми идеями о том, как можно получить выделенный текст в ЛЮБОЙ заявке?

+0

Несмотря на сказанное ниже, помните, что буфер обмена заполняется только тогда, когда приложение реализует Ctrl + C (или что-то еще); буфер обмена не является решением – smirkingman

ответ

7

К сожалению, нет способа получить выделенный текст из любого произвольного приложения. UI Automation работает , если приложение поддерживает UIA TextPattern; к сожалению, большинство нет. Я написал приложение, которое пытался это сделать, и имел кучу резервных копий.

Я попытался (в значительной степени в порядке убывания):

  1. UIA.TextPattern
  2. Internet Explorer конкретных (это были разные реализации для IE 6,7,8,9)
  3. Adobe Reader- конкретные
  4. Clipboard

Это покрыло 80-90% приложений там, но там было довольно мало, что до сих пор не удалось.

Обратите внимание, что восстановление буфера обмена имеет свои проблемы; некоторые приложения (Office и т. д.) помещают информацию о конкретном поставщике в буфер обмена, который может иметь указатели на внутренние данные; когда вы помещаете свою собственную информацию в буфер обмена, внутренние данные освобождаются, а когда вы ставите старые данные, буфер обмена теперь указывает на освобожденные данные, что приводит к сбоям. Вы можете немного обойти это, только сохраняя/восстанавливая известные форматы буфера обмена, но опять же, это приводит к нечетному поведению в том, что приложения ведут себя «неправильно», а не сбой.

+0

Как реализована конкретная реализация Adobe Reader? у вас есть какие-либо подробности, дайте мне знать. –

+0

Я сталкиваюсь с проблемой в IE, просьба ли вы предложить решение? –

+0

@ChintanPatel Это было несколько лет назад, и я потерял исходный код, поэтому я не могу помочь. –

1

Можно ли посмотреть в буфер обмена и сделать свою горячую клавишу: CTRL + C?

Вы не сможете прочитать выбранный текст из любого приложения. Например, некоторые файлы PDF защищают содержимое, которое запрещает копирование. Технология

1

МАУ не поддерживается всеми приложениями, вы можете попробовать использовать MSAA в некоторых случаях (например, FF, Chrome и т.д.), но вы все равно получите много проблем. Лучший способ сохранить текущий текст буфера обмена, отправить сообщение «CTRL + C» с помощью SendMessage Функция WinAPI, получить текст буфера обмена и восстановить исходный текст буфера обмена, как сказал Рик.

+1

Связывание буфера обмена необходимо будет сохранить, а затем вернуть обратно слова. Это не всегда легко. –

+0

Я пробовал ваш подход, но мне не удалось захватить выделенный текст из Office Word. :( http://stackoverflow.com/questions/25281314/capture-selected-text-from-any-window-does-not-sucess-with-office-word – Kiradev

 Смежные вопросы

  • Нет связанных вопросов^_^