Что нового

Получение текста из TPanel или Tlabel

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Снова пытаюсь вытащить текст из Delphi компонента Tlabel.
Стандартные средсва бессильны. Гугл особой инфы не дал.
Может кто нибудь докапается?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: Получение текста из TPanel

r35p3ct,
С Download Master у меня так работает без проблем:
Код:
$hHandle = WinGetHandle('Download Master')
$var = ControlGetText($hHandle, '', '[CLASS:TPanel; INSTANCE:2]')
MsgBox(0, '', $var)
 
Автор
R

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Re: Получение текста из TPanel

madmasles
С этой панелью я погорячился, текст получается, но к примеру правее есть тоже Tpanel, в которой отображается график скорости, вот из него уже не получить этим методом хотя там пишется скорость.
Текст этот кстати не могут прочитать такие программы как: Au3Info, WinSpy и т.д.
Вот и возникает вопрос, можно ли его вообще получить не прибегая к распознаванию по скриншоту?

Думаю копать нужно в сторону вот примерно этого:
Код:
var
  str: PChar;
  h: HWND;
  hPanel1: HWND;
  hPanel2: HWND;
  hEdit1: HWND;
  hEdit2: HWND;
begin
  h := FindWindow('TCusForm',nil);
  hPanel1 := FindWindowEx(h,0,'TPanel',nil);
  hPanel2 := FindWindowEx(h,hPanel1,'TPanel',nil);
  hEdit1 := FindWindowEx(hPanel2,0,'TEdit',nil);
  hEdit2 := FindWindowEx(hPanel2,hEdit1,'TEdit',nil);

  GetMem(str,100);
  SendMessage(hEdit1,WM_GETTEXT,100,Integer(PChar(str)));
  Edit1.Text := str;
  SendMessage(hEdit2,WM_GETTEXT,100,Integer(PChar(str)));
  Edit2.Text := str;
  FreeMem(str,100);
 
Автор
R

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Re: Получение текста из TPanel

Сделал для наглядности пример.
На TPanel находится компонент Tlabel, текcт которого я и пытаюсь получить.

ADD:
На Delphi этот вопрос удалось решить, осталось его портировать на AutoIt.
Form1
004635FC :Адрес формы
364 :Смещение надписи
 
Автор
R

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Нашелся способ получить текст через hook на отрисовку текста.
dll написана на Power Basic, помогите прикрутить ее к autoit.

На PB она подключается так:
Код:
   DECLARE FUNCTION SetHook LIB "HookD.Dll" ALIAS "SetHook" (hWnd AS LONG) AS LONG
и вызывается так:
Код:
         CASE %WM_INITDIALOG: SetHook CBHNDL
         CASE %WM_DESTROY   : hHook = GetProp(CBHNDL, BYVAL 1): IF hHook THEN UnhookWindowsHookEx hHook
в самой dll:
Код:
FUNCTION SetHook ALIAS "SetHook" ( hWnd AS LONG) EXPORT AS LONG
Код:
SetHook CBHNDL
Как я понимаю этой строкой вызывается функция из dll с параметром CBHNDL,который является дескриптором родительского окна.
на Autoit делаю так, но результата нет.
Код:
$hwnd=WinGetHandle('My Hook2')
DllCall($dll, "", "SetHook",'long',$hwnd)


или все это делать нужно через DLLCallbackRegister?

Приложил архив с dll:
AddDll.exe - Загрузчик на PB, чтобы показать как все это работает.
Project1.exe - Программа на Delphi из которой Dll через textout hook читает текст. МОжно заменить любой программой на Delphi с заголовком Form1 и компонентом Lablel с текстом.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Может не подойдет, но все же, что если попытаться получить данные не из GUI, а из памяти процесса?
Примеров в ветке ботописателей полно. Используют nomadmemory.au3
http://autoit-script.ru/index.php/topic,1607.msg11439.html#msg11439
 
Автор
R

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Redline
Эту тему я первой выкурил, поставил даже delphi, пример чтения в 3м посте есть, но данные читаются только из тестовых приложений, из нужного не читается т.к. данные в памяти походу не хранятся, а сразу отрисовываются в компоненты. Поэтому остается прицепить Dll.

ЗЫ Кому интересна тема, то ТУТ можно почитать.
 
Верх