Как получить слово под курсором в Windows? - программирование
Подтвердить что ты не робот

Как получить слово под курсором в Windows?

Я хочу создать приложение, которое получает слово под курсором (не только для текстовых полей), но я не могу найти, как это сделать. Использование OCR довольно сложно. Единственное, что я видел, это компоненты Deskperience. Они поддерживают "родной" способ, но я их дорого стоил. Теперь я пытаюсь понять, что это за "родной" способ (возможно, как-то связать). Любая помощь будет оценена.

EDIT: Я нашел способ, но он получает только весь текст элемента управления. Любая идея, как получить только слово под курсором из всего текста?

4b9b3361

Ответ 1

В последних версиях Windows рекомендуемый способ сбора информации из одного приложения в другое (если вы не владеете целевым приложением, конечно) заключается в использовании технологии UI Automation. Википедия довольно хороша для получения дополнительной информации об этом: Microsoft UI Automation

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

Вот небольшой консольный прикладной код, который будет отслеживать пользовательский интерфейс других приложений. Запустите его и переместите мышь в разные приложения. Каждое приложение имеет различную поддержку различных "шаблонов автоматизации пользовательского интерфейса". Например, существует шаблон Value и шаблон Text, как показано здесь.

static void Main(string[] args)
{
    do
    {
        System.Drawing.Point mouse = System.Windows.Forms.Cursor.Position; // use Windows forms mouse code instead of WPF
        AutomationElement element = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y));
        if (element == null)
        {
            // no element under mouse
            return;
        }

        Console.WriteLine("Element at position " + mouse + " is '" + element.Current.Name + "'");

        object pattern;
        // the "Value" pattern is supported by many application (including IE & FF)
        if (element.TryGetCurrentPattern(ValuePattern.Pattern, out pattern))
        {
            ValuePattern valuePattern = (ValuePattern)pattern;
            Console.WriteLine(" Value=" + valuePattern.Current.Value);
        }

        // the "Text" pattern is supported by some applications (including Notepad)and returns the current selection for example
        if (element.TryGetCurrentPattern(TextPattern.Pattern, out pattern))
        {
            TextPattern textPattern = (TextPattern)pattern;
            foreach(TextPatternRange range in textPattern.GetSelection())
            {
                Console.WriteLine(" SelectionRange=" + range.GetText(-1));
            }
        }
        Thread.Sleep(1000);
        Console.WriteLine(); Console.WriteLine();
    }
    while (true);
}

Автоматизация пользовательского интерфейса фактически поддерживается Internet Explorer и Firefox, но не Chrome, насколько мне известно. См. Эту ссылку: Когда будет доступен Google Chrome?

Теперь это только начало работы для вас:-), потому что:

  • В большинстве случаев все это имеет серьезные последствия для безопасности. Использование этой технологии (или прямой технологии Windows, такой как WindowFromPoint) потребует достаточных прав для этого (например, для администратора). И я не думаю, что у DExperience есть какой-то способ преодолеть эти ограничения, если они не устанавливают драйвер ядра на компьютере.

  • Некоторые приложения никому не будут раскрывать, даже с надлежащими правами. Например, если я пишу банковское приложение, я не хочу, чтобы вы следили за тем, что отобразит мое приложение:-). Другие приложения, такие как Outlook с DRM, не будут раскрывать что-либо по тем же причинам.

  • Только поддержка пользовательского интерфейса Поддержка текстового шаблона может предоставить больше информации (например, слова), чем просто весь текст. Увы, этот конкретный шаблон не поддерживается IE и FF, даже если они поддерживают глобальную автоматизацию пользовательского интерфейса.

Итак, если все это не сработает для вас, вам нужно будет погрузиться глубже и использовать методы распознавания OCR или формы. Даже при этом будут случаи, когда вы не сможете сделать это вообще (из-за обеспечительных прав).

Ответ 2

Это нетривиально, если приложение, которое вы хотите "шпионить", рисует сам текст. Одним из возможных решений является запуск другого приложения для рисования части его окна путем аннулирования области непосредственно под курсором.

При рисовании другого приложения вам придется перехватывать вызовы текстового рисования. Один из способов сделать это - ввести код в другое приложение и перехватить вызовы в функции GDI, которые рисуют текст. Когда вы отлаживаете собственные приложения, это то, что визуальная студия делает для реализации контрольных точек. Чтобы проверить идею, вы можете использовать библиотеку, например detours (но это не бесплатно для коммерческого использования).

Вы также можете проверить, поддерживает ли приложение один из API доступности, который находится в Windows, чтобы облегчить такие функции, как скрин-ридеры для слепых.

Одно слово предостережения: я сам этого не делал.

Ответ 3

Если приложение должно обрабатывать не только приложения .Net, я бы начал с импорта функций (P/Invoke):

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

После некоторой проверки это выглядит как лучший способ (к сожалению, также тяжелый) - подключиться к визуализации текста GDI некоторое обсуждение

Ответ 4

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

Вероятно, вы получили текст окна или что-то в этом роде. Но что, если курсор находится над окном, которое не использует текст окна для хранения его содержимого? Windows не обязана хранить свои данные определенным образом.

Это заканчивается тем, что указывает на распознавание символов, когда вы смотрите на пиксели под курсором и пытаетесь выяснить, какие слова есть. Но не только это очень нетривиально, но и не является надежным. Что делать, если часть слова не видна, потому что она выходит из окна?

Это определенно не тривиально. Есть несколько способов приблизиться к нему. Но нет надежного способа работы со всеми окнами.

Ответ 5

Существует файл sdk для получения текста с использованием OCR. Это не бесплатно, но довольно дешево по сравнению с другими продуктами: http://www.screenocr.com/screen-ocr-library-sdk.htm У них есть приложение, которое предоставляет те же функции, что и вы можете попробовать демо.

Ответ 6

Чтобы достичь этого, вам нужен многоцелевой подход.

UIA работает во многих приложениях, но вам нужно поэкспериментировать, чтобы увидеть, где текст возвращается. Это может быть элемент, значение или диапазон. В офисных приложениях нет согласованности.

Если UIA не удалось, перечислите таблицу выполняемых объектов (ROT) и верните указатели COM в различные приложения, зарегистрированные в ROT. Затем вы можете применить эти указатели к основным типам офисов:
например:

enumerate ROT  - then
 wb = (Excel._Workbook)enumerator.Value;
string strText = wb.Application.ActiveCell.Text.ToString();

Если вышеприведенные два метода не работают, используйте свободную систему OCR в MODI (Библиотека типов документов Microsoft Office Documentation 12.0)