1

Тема: AHK: Получить текст из контрола

Добрый день.
Есть программа, написана, скорее всего, на Delphi.
В программе есть контролы типа TPanel. Очень хочется получить из него текущее значение.
К посту привязан скриншот, по которому видно, что текущее значение Text - пустое, соответственно и


    ControlGetText, OutputVar, TPanel13, Программа

даёт пустое значение.

Есть какие-нибудь мысли, как получить текст?

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

2

Re: AHK: Получить текст из контрола

Вообще-то, TPanel — контейнер, на котором располагаются другие элементы управления, например TLabel.

3

Re: AHK: Получить текст из контрола

А как до них добраться? WinSpy их не показывает... Перебирать наугад?

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

4

Re: AHK: Получить текст из контрола

Upd

ControlSend, TPanel13, 1234, Программа

срабатывает корректно, стало быть всё-таки текст в самом TPanel13.
Изначальный вопрос в силе.
Думаю, что нужен метод ControlGet (без Text), но у него очень запутанное описание, и первичные эксперименты нужного результата не дали...

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

5

Re: AHK: Получить текст из контрола

Попробуйте так:

ControlGet, ControlID, hwnd, TPanel13, Программа  ; здесь вместо «Программа» указать точное название окна программы
Arr := [], pArr := Object(Arr)
DllCall("EnumChildWindows", Ptr, ControlID, Ptr, RegisterCallback("Enum", "Fast"), Ptr, pArr)
ObjRelease(pArr)
MsgBox, % arr[1]
Return

Enum(hwnd, lp)
{
   ControlGetText, text,, ahk_id %hwnd%
   if (text = "")
      Return 1
   
   Object(lp).Push(text)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6 (изменено: Foma, 2015-05-24 19:03:41)

Re: AHK: Получить текст из контрола

Что-то я этот ControlGet не понял. Там всё правильно или ещё List надо добавить?

7

Re: AHK: Получить текст из контрола

Смотря, что нужно получить.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Получить текст из контрола

hwnd вроде получаем. У меня в таком виде даже не запускается.

9

Re: AHK: Получить текст из контрола

Что значит не запускается? Ошибку выдаёт? У вас тоже программа с контролом TPanel1?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Получить текст из контрола

Ошибку: после «hwnd» пропущен пустой параметр.
А после исправления — пустой MsgBox.

11

Re: AHK: Получить текст из контрола

Действительно, пропущен пустой параметр. Если пустой MsgBox — значит этот метод не сработал. Нужно экспериментировать при наличии такового контрола, у меня его нету.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12 (изменено: Malcev, 2015-05-25 05:16:40)

Re: AHK: Получить текст из контрола

А с помощью этого скрипта текст удается получить?
http://www.autohotkey.com/board/topic/9 … -anywhere/

13

Re: AHK: Получить текст из контрола

teadrinker пишет:

Нужно экспериментировать при наличии такового контрола, у меня его нету.

Например, в InqSoft Window Scanner на TPanel'ях расположены TEdit'ы и статические подписи к ним («Комбинация TLabel и TEdit»?), которые здесь не определяются:



[ ]MainWin "InqSoft"
    ( )Tag="InqSoft Window Scanner"
    ( )Class="TWindowScannerForm"
    ( )Parent=1
    ( )Child=0
    [ ]MainWin "TPanel1"
        ( )Tag=1
        ( )Class="TPanel"
        ( )Parent=0
        ( )Child=1
    [ ]MainWin "TPanel2"
        ( )Tag=2
        ( )Class="TPanel"
        ( )Parent=0
        ( )Child=1
    [ ]MainWin "Panel1"
        ( )Tag="Panel1"
        ( )Class="TPanel"
        ( )Parent=1
        ( )Child=1
        [ ]MainWin "TPanel1"
            ( )Tag=1
            ( )Class="TPanel"
            ( )Parent=1
            ( )Child=1
            [ ]MainWin "TEdit1"
                ( )Tag=1
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
            [ ]MainWin "TEdit2"
                ( )Tag=2
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
        [ ]MainWin "TPanel2"
            ( )Tag=2
            ( )Class="TPanel"
            ( )Parent=1
            ( )Child=1
            [ ]MainWin "TEdit1"
                ( )Tag=1
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
            [ ]MainWin "TEdit2"
                ( )Tag=2
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
            [ ]MainWin "TEdit3"
                ( )Tag=3
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
            [ ]MainWin "TEdit4"
                ( )Tag=4
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
            [ ]MainWin "TEdit5"
                ( )Tag=5
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
            [ ]MainWin "TEdit6"
                ( )Tag=6
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
        [ ]MainWin "TPanel3"
            ( )Tag=3
            ( )Class="TPanel"
            ( )Parent=1
            ( )Child=1
            [ ]MainWin "TEdit1"
                ( )Tag=1
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
            [ ]MainWin "TEdit2"
                ( )Tag=2
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
            [ ]MainWin "TEdit3"
                ( )Tag=3
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
            [ ]MainWin "TEdit4"
                ( )Tag=4
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
            [ ]MainWin "TEdit5"
                ( )Tag=5
                ( )Class="TEdit"
                ( )Parent=0
                ( )Child=1
Malcev пишет:

А с помощью этого скрипта текст удается получить?

Не могу проверить: «Класс не зарегистрирован».

14

Re: AHK: Получить текст из контрола

wisgest пишет:

InqSoft Window Scanner

https://cloclo14.cloud.mail.ru/weblink/thumb/w3/2QxLCoBu7UaZ/2015.05.25-05.33.13.4.jpg

Вот так удаётся получить текст из нижележащего под TPanel5 TEdit'а:

ControlGet, ControlID, hwnd,, TPanel5, InqSoft Window Scanner

Arr := [], pArr := Object(Arr)
DllCall("EnumChildWindows", Ptr, ControlID, Ptr, RegisterCallback("Enum", "Fast"), Ptr, pArr)
ObjRelease(pArr)
MsgBox, % arr[1]
Return

Enum(hwnd, lp)
{
   ControlGetText, text,, ahk_id %hwnd%
   if (text = "")
      Return 1
   
   Object(lp).Push(text)
}

<Окно не существует>

А текст заголовка TPanel5 (в данном случае «Текст окна») получить не удаётся никак.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Получить текст из контрола

teadrinker пишет:

Попробуйте так:

ControlGet, ControlID, hwnd, TPanel13, Программа  ; здесь вместо «Программа» указать точное название окна программы
Arr := [], pArr := Object(Arr)
DllCall("EnumChildWindows", Ptr, ControlID, Ptr, RegisterCallback("Enum", "Fast"), Ptr, pArr)
ObjRelease(pArr)
MsgBox, % arr[1]
Return

Enum(hwnd, lp)
{
   ControlGetText, text,, ahk_id %hwnd%
   if (text = "")
      Return 1
   
   Object(lp).Push(text)
}

Попробовал, предсказуемо пусто, ибо ControlGetText - пустой

ControlGet, ControlID, hwnd, , TPanel13, Программа  ; здесь вместо «Программа» указать точное название окна программы

Мне всё больше кажется, что ahk просто не умеет работать с этим контролом. Впрочем, равно как и autoit

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

16

Re: AHK: Получить текст из контрола

MikeSh пишет:

ControlGetText - пустой

Какой именно ControlGetText пустой?

ahk просто не умеет работать с этим контролом.

Так у вас же на скриншоте видно, что он определяется, как же не умеет? Другое дело, что текст из него не получить, это да.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Получить текст из контрола

teadrinker пишет:
MikeSh пишет:

ControlGetText - пустой

Какой именно ControlGetText пустой?

ControlGetText ... TPanel13 - пустой, т.е. информация содежится не в свойстве text, видимо

teadrinker пишет:

Другое дело, что текст из него не получить, это да.

Да, это и имел ввиду.

Печаль. Возлагал большие надежды на текст из этого контрола...

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

18 (изменено: wisgest, 2015-05-25 10:39:03)

Re: AHK: Получить текст из контрола

teadrinker пишет:

<Окно не существует>

Ну, да; но если «окно существует», то пустое сообщение, а если при этом вставить

MsgBox, % text

внутрь Enum(), то однократный MsgBox с содержимым поля «Клиентской области».

teadrinker пишет:

А текст заголовка TPanel5 (в данном случае «Текст окна») получить не удаётся никак.

Думаю, это не заголовок TPanel5, а одного из расположенных на ней TLabel'ов.
И это именно то, что нужно MikeSh:

MikeSh пишет:

WinSpy их не показывает

— TEdit'ы он то показывает.
Да и их содержимое легко доступно:

ControlGetText, Text, TEdit8, InqSoft Window Scanner
MsgBox %Text%

Да, и сами TPanel имеют легко доступный, возможно скрытый другими элементами, текст:

ControlGet, hwnd, hwnd,, TPanel5, InqSoft Window Scanner
WinHide, ahk_id %hwnd%

ControlGetText, Text, TPanel3, InqSoft Window Scanner
MsgBox %text%

— пример будет работать, если InqSoft Window Scanner запускается с уже нажатой одной и только одной кнопкой «Процесс», «Сообщения» или «Инструменты»; если все они отжаты, то надо заменить TPanel5, TPanel3 на TPanel4, TPanel2, соответственно.

19

Re: AHK: Получить текст из контрола

MikeSh пишет:

Печаль. Возлагал большие надежды на текст из этого контрола...

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

20

Re: AHK: Получить текст из контрола

wisgest пишет:

но если «окно существует», то пустое сообщение

Мой код просто показывает текст из первого же дочернего контрола, из которого можно получить какой-либо текст (TEdit, но когда я его писал, я ещё не знал об этом ). У меня он, когда окно существует, показывает текст из поля с размерами клиентской области окна. Если показывает пустое сообщение, несмотря на то, что в функции текст определяется, возможно, у вас устаревший AHK.

wisgest пишет:

Думаю, это не заголовок TPanel5, а одного из расположенных на ней TLabel'ов

Таких контролов я не обнаружил:
https://cloclo24.cloud.mail.ru/weblink/thumb/w3/2DjbZSi1svGX/2015.05.25-09.41.24.4.jpg

wisgest пишет:

TEdit'ы он то показывает

Так на скриншоте не TEdit, а именно TPanel.

wisgest пишет:

Да, и сами TPanel имеют легко доступный, возможно скрытый другими элементами, текст:

Не совсем понял. Код

ControlGetText, Text, TPanel3, InqSoft Window Scanner
MsgBox %text%

действительно выдаёт результат Panel1 (которого не видно в окне), однако другие панели текст не отдают.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK: Получить текст из контрола

wisgest пишет:
MikeSh пишет:

Печаль. Возлагал большие надежды на текст из этого контрола...

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

Не настолько большие )

Как я уже писал, ControlSend посылает текст в TPanel13 корректно, получается, что всё-таки работа идёт с панелью, а не с контролом типа TLabel, который скрыт под ним

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

22 (изменено: wisgest, 2015-05-25 11:39:03)

Re: AHK: Получить текст из контрола

teadrinker пишет:

возможно, у вас устаревший AHK.

1.1.19.03

teadrinker пишет:

Таких контролов я не обнаружил

А они там есть, там ещё и кнопочки есть…

teadrinker пишет:

Так на скриншоте не TEdit, а именно TPanel.

Так и я о том же, что TEdit нам ни к чему.

teadrinker пишет:

однако другие панели текст не отдают

Думаю, их текст просто пустой и его можно назначить самому.

MikeSh пишет:

Как я уже писал, ControlSend посылает текст в TPanel13 корректно, получается, что всё-таки работа идёт с панелью, а не с контролом типа TLabel, который скрыт под ним

TPanel — не поле ввода, поэтому отправка в него клавиш не должна ни к чему привести, если для него не написан обработчик событий клавиатуры, а если написан, то он можен отобразить перехваченные клавиши в каком угодно другом элементе.
На всякий случай попробуйте отправить нечто подобное «Ctrl-A, Ctrl-C».

Вопрос уже поднимался, не разобрался только, с каким исходом:
http://autoit-script.ru/index.php?topic=2813.0
https://exelab.ru/f/index.php?action=vt … opic=22734

23

Re: AHK: Получить текст из контрола

wisgest пишет:

1.1.19.03

Точно устаревший.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24 (изменено: MikeSh, 2015-05-25 11:59:29)

Re: AHK: Получить текст из контрола

У меня версия 1.1.22.0, так, на всякий
wisgest, вы правы. На всём приложении обработка клавиш.

ControlSend TPanel14, 123, Программа

=

ControlSend TPanel13, 123, Программа


Upd
Имеется ввиду, что в какой элемент не шли клавиши, попадёт в TPanel13

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

25

Re: AHK: Получить текст из контрола

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

Темы про память уже обсуждались.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

26

Re: AHK: Получить текст из контрола

Alectric пишет:

Тогда вариант - читать память процесса.

Не, это тоже перебор, как и с распознаванием.
Переживу, всем спасибо за помощь.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.