Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вытащить текст из дочернего окна [D7, WinXP]


Страницы:   1 2

Tanya ©   (2006-08-01 20:33:00) 

Есть хендл окна, в котором находятся дочерние окна, Edit-ы, кнопки и т.д., вот как из них всех вытащить текст? Функция GetWindowText вытаскивает почему-то пустой текст. Делаю я так:

function EnumChildProc(hwnd: Hwnd; lParam: Longint): Longint; stdcall;
var
 sText: array [0..MAX_PATH] of Char;
begin
 Form1.Memo1.Lines.Add('#' + IntToStr(hwnd));
 GetWindowText(hwnd, sText, SizeOf(sText));
 Form1.Memo1.Lines.Add(sText);
 Result := 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Memo1.Lines.Clear;
 EnumChildWindows(sHWND, @EnumChildProc, 0);
end;


Мастера, подскажите пожалуйста..


Stakan   (2006-08-02 16:36:00) [21]

Ketmar ©   (02.08.06 16:27) [10]
Каюсь, в этой строчке недоглядел:
SendMessage(hwnd, WM_GETTEXT, TextLen, PChar(pText));
Нужно так:
SendMessage(Handle, WM_GETTEXT, TextLen, LPARAM(PChar(pText)));
Зато у тебя Есть GetMem, но нет FreeMem (и указания, что его нужно использовать тоже), а это уже хуже.


Ketmar   (2006-08-02 16:27:00) [22]

> [10] Stakan ©   (02.08.06 16:13)

в том, что во-первых, твоё даже не скомпилируется, а во-вторых -- RTFM. в частности, по сторокам и преобразованиям.


Stakan   (2006-08-02 16:13:00) [23]

Ketmar ©   (02.08.06 14:01) [8]
А в чём принципиальная разница :)?


Ketmar   (2006-08-02 14:01:00) [24]

> [7] Stakan ©   (02.08.06 13:50)

расстрелять без права обжалования.


var
 textLen: Integer;
 pText: PChar;
begin
 textLen := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
 GetMem(pText, textLen+1);
 pText[SendMessage(hwnd, WM_GETTEXT, textLen, LPARAM(pText))] := #0;
 ...
end;


Stakan   (2006-08-02 13:50:00) [25]

Tanya   (02.08.06 13:13) [6]
var
 TextLen: Integer;
 pText: String;
begin
 TextLen := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0) + 1;
 SetLength(pText, TextLen);
 SendMessage(hwnd, WM_GETTEXT, TextLen, PChar(pText));
 ...
end;


Tanya   (2006-08-02 13:13:00) [26]

Ketmar, Подскажи пожалуйста как память для pText выделить?


Ketmar   (2006-08-02 10:23:00) [27]

> [4] Германн ©   (02.08.06 01:39)

заметил. поэтому и отучаю от постинга такого кода сюда. а то потом появится ещё одна ветка типа "а почему у меня иногда работает, а иногда -- не работает?"


Германн   (2006-08-02 01:39:00) [28]

2 Ketmar ©   (01.08.06 23:00) [3]
А ты вот это заметил?

> ...

А там может быть спрятано столько всего! :-)


Ketmar   (2006-08-01 23:00:00) [29]

> [2] Tanya   (01.08.06 22:30)

нет, "вот так" не работает. куда, аднака, указывает pText? сколько для него памяти выделено?


Tanya   (2006-08-01 22:30:00) [30]

Вот так работает, спасибо...)))


pText: PChar;
...
SendMessage(hwnd, WM_GETTEXT, SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0) + 1, Integer(pText));
Form1.Memo1.Lines.Add('Text: ' + pText);


begin...end   (2006-08-01 21:38:00) [31]

Если окно принадлежит чужому процессу, используйте WM_GETTEXT вместо GetWindowText.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо