![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вытащить текст из дочернего окна [D7, WinXP]
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.