Получите выделенный текст от активного окна

Я хотел бы знать, как может я получать выделенный текст от любого окна, например: (Excel, т.е., Firefox, …). обратите внимание на то, что следующее сообщение не работает в вышеупомянутом приложении WM_GETTEXT, WM_COPY, EM_GETSELTEXT.

Я также попробовал управление C (копия) и получаю выделенный текст от буфера обмена, но это не хорошая идея.

Язык использовал: C#

7
задан Gaby 13 January 2010 в 15:47
поделиться

4 ответа

Нет ответов, а? Ну, я знаю, что вы можете получить его от Excel, Word etc, используя Interop. Посмотри на это. Это может дать вам идеи сом, о том, как действовать с IE и FF. Но в основном это получение приложения должно иметь какую-то обшивку для того, чтобы позволить вам сделать это, и я не думаю, что есть любой общий способ, который работает все время.

1
ответ дан 7 December 2019 в 18:43
поделиться

Вот наименее Pythonic способ:

out = ""
for x in range(len(lst)):
  for y in range(len(lst)):
    if x + y == len(lst)-1:
        out = lst[y] + out
-121--1217156-

IEnumerable приходит на ум.

-121--1131762-

Нет необходимости записывать это на языке C # с нуля. Что не так с использованием буфера обмена? Этот сценарий обеспечивает восстановление того, что было в буфере обмена после его завершения.

Autohotkey делает это намного проще.

; Hotkey:  Ctrl Shift t

^!t::

; Remember what was in the clipboard
clipboardPrev = %clipboard%

; Clear the clipboard
clipboard:=

Sleep,200

; Send a Ctrl C to copy the current selection
SendInput, {Ctrl down}c{Ctrl up}

Sleep,200

; Get the current selection from the clipboard
selectedText=%Clipboard%

if SelectedText =
{
    ; If the first attempt didn't get any test, try again
    Sleep,200

    ; Send a Ctrl C to copy the current selection
    SendInput, {Ctrl down}c{Ctrl up}

    ; Get the current selection from the clipboard
    selectedText=%Clipboard%

}

; Restore the clipboard
clipboard=%clipboardPrev% 

MsgBox, %selectedText%

return
-1
ответ дан 7 December 2019 в 18:43
поделиться

На этот вопрос нет ответа общего назначения. У каждого класса окна будет свое решение.

Например, если в окне редактирования находится текст с подсветкой, то вы можете использовать EM_GETSEL для получения диапазона выделения, затем WM_GETTEXT для получения текста (а затем бросить невыделенную часть в сторону) или EM_LINEFROMCHAR для преобразования этого диапазона в линейные индексы, а затем EM_GETLINE для получения выделенного текста по одной строке за раз.

Но это не сработает ни для какого другого класса окон.

1
ответ дан 7 December 2019 в 18:43
поделиться

Я сам не пробовал, но Microsoft UI Automation API должен иметь нужную вам функциональность.

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

Хорошим местом для начала будет «Обзор текстового шаблона» по адресу http://msdn.microsoft.com/en-us/library/ms745158.aspx

Также следите за вопросом 517694 . Думаю, вы обнаружите, что ответы на этот вопрос решат вашу проблему.

1
ответ дан 7 December 2019 в 18:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: