Мониторинг выборов в любом приложении - PullRequest
1 голос
/ 04 октября 2010

Я хочу отслеживать все выделения текста, сделанные пользователем в любом приложении.Это возможно?Я бы предпочел решение в .net, но ванильный C ++ в порядке.

Если нет, могу ли я отслеживать все операции копирования текста (CTRL + C) из приложения .net?

аналогичный вопрос: В C # есть ли способ последовательно получать выделенное текстовое содержимое текущего окна?

Ответы [ 2 ]

3 голосов
/ 04 октября 2010

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

Но есть большая проблема: управление без окон. Элементы управления без окон, как говорит сам термин, не являются окнами, поэтому у них нет HWND или чего-либо еще; на самом деле их можно представить как пиксели, нарисованные на экране, без какого-либо дополнительного интерфейса из extern приложения (обычно это COM материал). Вы не можете подключить их, вы не можете создать подкласс их, и, поскольку они обычно используют COM интерфейсы для уведомления своего владельца ( случайный пример ), вы не можете создать подкласс их владельца для получения их уведомлений. Конечно, возможно, есть какой-то странный способ получить их содержимое, но он, вероятно, включает в себя внедрение dll в каждом процессе и даже менее общий, чем метод, предложенный для «обычных» полей редактирования.

Поскольку элементы управления без окон довольно широко распространены (например, браузеры и приложения, использующие DirectUI, используют их, чтобы не тратить тонны HWND с, IIRC Office также использует их, приложения WPF используют собственный вид элементов управления без окон, VB6 / Приложения Delphi могут использовать их, ...), вам будет не хватать многих вариантов, поэтому я советую вам следовать способу перехвата копирования, который намного проще и безопаснее.

В этом отношении вы можете следовать совету @ Richard и использовать API AddClipboardFormatListener . Имейте в виду, что это доступно только в Windows Vista и далее, поэтому, если вы хотите быть совместимым с предыдущими версиями Windows, вам следует использовать более старый набор API «Clipboard Viewer». Некоторая информация здесь .

<ч /> Редактировать

Э-э, я забыл об этом, я пытался выяснить, может ли Active Accessibility (хотя часто неправильно реализуется ) помочь вам в этой задаче, и был этот многообещающий метод , но оказывается, что это только для выбранных подобъектов, и, как правило,

Примечание для клиентов Active Accessibility не предоставляет выбор текста в элементах управления edit и rich edit.

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

3 голосов
/ 04 октября 2010

Зарегистрируйтесь и обработайте WM_CLIPBOARDUPDATE сообщений в (скрытом) окне.

...