Как получить выделенный текст из любого окна (с помощью автоматизации пользовательского интерфейса) - C # - PullRequest
7 голосов
/ 22 ноября 2010

У меня есть небольшое приложение в трее, которое регистрирует общесистемную горячую клавишу.Когда пользователь выбирает текст в любом месте приложения и нажимает эту горячую клавишу, я хочу иметь возможность зафиксировать выделенный текст.В настоящее время я делаю это с помощью AutomationElements:

//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 и т.на.)

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

Ответы [ 3 ]

7 голосов
/ 12 июля 2013

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

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

  1. UIA.TextPattern
  2. Internet Explorer-специфический (это было различные реализации для IE 6,7,8,9)
  3. Специфичный для Adobe Reader
  4. Буфер обмена

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

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

2 голосов
/ 22 ноября 2010
Технология

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

1 голос
/ 22 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...