2016-03-18 4 views
0

Я знаю, что вы можете получить выбор текста, отправив сообщение WM_COPY, а затем прочитав новое содержимое буфера обмена.
Но как Windows извлекает выбор текста в первую очередь, прежде чем он будет храниться в буфере обмена? Я имею в виду, что должен быть способ получить текст, не отправив его в буфер обмена, верно?
Но все, что я мог найти в Интернете, это обходные пути, которые пишут в буфер обмена, а затем быстро восстанавливают старое содержимое. Однако это не то, что я ищу.WinAPI: получение текстового выделения активного окна без использования буфера обмена

(Этот вопрос не о конкретном языке программирования).

+0

Официальный, документально подтвержденный и поддерживаемый API для использования в таких сценариях, как [Автоматизация пользовательского интерфейса] (https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx). – IInspectable

ответ

1

Просто отправьте EM_GETSEL к контролю, а затем использовать GetWindowText, чтобы получить полный текст управления и извлечь только выбор.

Как вы, возможно, догадались, что это не так эффективно, как WM_COPY.
Это потому, что Редактировать Элементы управления не предназначены для работы с огромными текстами, для этого (и для других целей) есть элемент управления RichEditText.

Это позволяет сделать некоторые эффективные копии либо с помощью:

  1. EM_GETSELTEXT получить только выделенный текст. Вам все еще нужно знать, сколько места выделить: это тривиально с EM_GETSEL или EM_EXGELSEL.

  2. Использование EM_GETSEL (или его эквивалент), а затем потоковой передачи текста с помощью EM_STREAMOUT.

Само собой разумеется, все это достигается с помощью одного API SendMessage, который, если не уже, вы должны стали уверенно.

+0

* «Как вы, возможно, догадались, что это не так эффективно, как WM_COPY» * - Есть ли у вас ссылка на это заявление? Почему открытие буфера обмена, копирование данных в глобальную память и очистка (в дополнение к извлечению содержимого управления) могут быть более эффективными, чем получение содержимого управления? – IInspectable

+0

Итак, я должен выяснить, с каким контролем я столкнулся, и затем мне нужно выяснить, что нужно отправить. Как насчет пользовательских элементов управления, к ним можно обращаться одинаково? Как Windows определяет, какое сообщение отправлять и т. Д.? – Forivin

+0

@Forivin: Посмотрите мой комментарий к своему ответу. Это ваш единственный вариант при работе с пользовательскими элементами управления или без окна (например, для приложений Qt). – IInspectable