Что нового

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

yaksamace

Новичок
Сообщения
3
Репутация
0
Всем доброго дня.

В настоящий момент стоит задача получения значения выделенного текста.

Погуглив я обнаружил замечательную функцию
Код:
_GUICtrlRichEdit_GetSelText()


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

Подскажите, пожалуйста, в чём закралась ошибка.

Логика следующая: запускаем скрипт, alt+tab в нужное окно, выделяем текст, нажимаем F11.

Результат везде один (вернее, минус один :smile:) и в самом окне SciTE, и в Блокноте, и в Google Chrome.

Код:
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiStatusBar.au3>
#include <GuiRichEdit.au3>


HotKeySet ( "{F11}", "Example")

Func Example()

   $handle = WinGetHandle("[ACTIVE]")

   ConsoleWrite ($handle & @CRLF)

   Sleep (2000)

   Send ("{CTRLDOWN}")
   Send ("{SHIFTDOWN}")
   Send("{LEFT}")
   Send ("{CTRLUP}")
   Send ("{SHIFTUP}")

   ConsoleWrite(@CRLF & _GUICtrlRichEdit_GetSelText($handle))

   $text = _GUICtrlEdit_GetSel($handle)
   ConsoleWrite ($text)


EndFunc

While 1
    Sleep(100)
WEnd
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Может без неё обойтись?

Код:
HotKeySet ( "{F11}", "Example")

Func Example()
	Send("^c")
	$txt = ClipGet()
	MsgBox(0, "", $txt)
EndFunc

While 1
	Sleep(100)
WEnd
 
Автор
Y

yaksamace

Новичок
Сообщения
3
Репутация
0
hedji сказал(а):
Может без неё обойтись?

Нет, к сожалению, такое решение не удовлетворяет цели. Как раз из-за этого я и начал углубляться в более сложные функции, чем ClipGet. В общем и целом меня интересует, как заставить эту функцию прочитать выделенный текст в отдельно взятом окне (без всех этих излишеств, вроде создания GUI-окна, из примера), или объяснить, почему она не может работать подобным образом в принципе.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Потому что ей нужен дескриптор не окна, а элемента.
В примере, это элемент Edit.
Но не каждое окно позволит получить список его элементов.
 
A

Alofa

Гость
Код:
#include <GuiEdit.au3>

ConsoleWrite('[' & Example() & ']' & @LF)

Func Example()
	Local $hControl, $sGetText, $aSel
	$hControl = ControlGetHandle(WinGetHandle("[ACTIVE]"), '', '')
	$aSel = _GUICtrlEdit_GetSel($hControl)
	$sGetText = ControlGetText('', '', $hControl)
	Return StringRegExpReplace($sGetText, '(?s)^.{' & $aSel[0] & '}(.{' & ($aSel[1] - $aSel[0]) & '}).*', '\1')
	; или так: Return StringLeft(StringTrimLeft($sGetText, $aSel[0]), $aSel[1] - $aSel[0])
EndFunc   ;==>Example



Добавлено:
Сообщение автоматически объединено:

Или так:
Код:
#include <GuiEdit.au3>

HotKeySet("{F11}", "Example")

Func Example()
	Local $aSel = _GUICtrlEdit_GetSel(ControlGetHandle('', '', ''))
	Local $sGetText = ControlGetText('', '', '')
	ConsoleWrite(StringLeft(StringTrimLeft($sGetText, $aSel[0]), $aSel[1] - $aSel[0]) & @LF)
EndFunc   ;==>Example

While Sleep(100)
WEnd

Если возникнут вопросы, то почитайте: Особенности функций Control (управление элементами окна)
 
Автор
Y

yaksamace

Новичок
Сообщения
3
Репутация
0
Alofa сказал(а):

hedji сказал(а):
Потому что ей нужен дескриптор не окна, а элемента.
В примере, это элемент Edit.
Но не каждое окно позволит получить список его элементов.

Большое спасибо за прояснение, стало несколько понятнее. Судя по всему, данная функция мне не подходит в силу того, что не все окна могут вернуть декскриптор элемента. К примеру, в Chrome этот метод не работает.

В таком случае вопрос, касательно буфера обмена. Я не хотел его использовать в силу того, что при работе скрипта в буфер будут помещаться данные, которые могут перезаписать важные пользовательские данные, причём не только текстовые, но и любые другие (форматированный текст, изображение и т.п.). Работа AutoIT с буфером в основном сосредоточена на тексте, поэтому вопрос: имеется ли возможность сохранения изначального буфера любого формата в файл, переменную, массив... с сохранением его структуры, чтобы после операции помещения выделенного текста в буфер, а потом в переменную, изначальное содержимое буфера обмена можно было бы восстановить?
 
Верх