Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
ВнизВытащить текст из дочернего окна Найти похожие ветки
← →
Tanya (2006-08-01 20:33) [0]Есть хендл окна, в котором находятся дочерние окна, 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;
Мастера, подскажите пожалуйста..
← →
begin...end © (2006-08-01 21:38) [1]Если окно принадлежит чужому процессу, используйте WM_GETTEXT вместо GetWindowText.
← →
Tanya (2006-08-01 22:30) [2]Вот так работает, спасибо...)))
pText: PChar;
...
SendMessage(hwnd, WM_GETTEXT, SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0) + 1, Integer(pText));
Form1.Memo1.Lines.Add("Text: " + pText);
← →
Ketmar © (2006-08-01 23:00) [3]> [2] Tanya (01.08.06 22:30)
нет, "вот так" не работает. куда, аднака, указывает pText? сколько для него памяти выделено?
← →
Германн © (2006-08-02 01:39) [4]2 Ketmar © (01.08.06 23:00) [3]
А ты вот это заметил?
> ...
А там может быть спрятано столько всего! :-)
← →
Ketmar © (2006-08-02 10:23) [5]> [4] Германн © (02.08.06 01:39)
заметил. поэтому и отучаю от постинга такого кода сюда. а то потом появится ещё одна ветка типа "а почему у меня иногда работает, а иногда -- не работает?"
← →
Tanya (2006-08-02 13:13) [6]Ketmar, Подскажи пожалуйста как память для pText выделить?
← →
Stakan © (2006-08-02 13:50) [7]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;
← →
Ketmar © (2006-08-02 14:01) [8]> [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 16:13) [9]Ketmar © (02.08.06 14:01) [8]
А в чём принципиальная разница :)?
← →
Ketmar © (2006-08-02 16:27) [10]> [10] Stakan © (02.08.06 16:13)
в том, что во-первых, твоё даже не скомпилируется, а во-вторых -- RTFM. в частности, по сторокам и преобразованиям.
← →
Stakan © (2006-08-02 16:36) [11]Ketmar © (02.08.06 16:27) [10]
Каюсь, в этой строчке недоглядел:SendMessage(hwnd, WM_GETTEXT, TextLen, PChar(pText));
Нужно так:SendMessage(Handle, WM_GETTEXT, TextLen, LPARAM(PChar(pText)));
Зато у тебя Есть GetMem, но нет FreeMem (и указания, что его нужно использовать тоже), а это уже хуже.
← →
Германн © (2006-08-02 16:39) [12]
> Зато у тебя Есть GetMem, но нет FreeMem (и указания, что
> его нужно использовать тоже), а это уже хуже.
>
А ему это и не нужно :-)
http://delphimaster.net/view/15-1154358587/
← →
Ketmar © (2006-08-02 16:48) [13]> [11] Stakan © (02.08.06 16:36)
LPARAM(@pText[1]), если уж на то пошло. %-)
← →
Leonid Troyanovsky © (2006-08-02 17:19) [14]
> Stakan © (02.08.06 13:50) [7]
> TextLen := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0) +
> 1;
> SetLength(pText, TextLen);
> SendMessage(hwnd, WM_GETTEXT, TextLen, PChar(pText));
TextLen := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
SetLength(pText, TextLen);
if TextLen > 0 then
SendMessage(hwnd, WM_GETTEXT, TextLen+1, PChar(pText));
--
Regards, LVT.
← →
Leonid Troyanovsky © (2006-08-02 17:21) [15]
> Leonid Troyanovsky © (02.08.06 17:19) [14]
> SendMessage(hwnd, WM_GETTEXT, TextLen+1, PChar(pText));
Фу-ты, LParam(PChar(pText)),
sorry.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2006-08-02 17:25) [16]
> Ketmar © (02.08.06 16:48) [13]
> LPARAM(@pText[1]), если уж на то пошло. %-)
Не, это уж слишком пошло.
Можно б было представить Pointer(pText),
но длину строки, все равно, надо проверять.
--
Regards, LVT.
← →
begin...end © (2006-08-02 17:42) [17]> Ketmar © (02.08.06 14:01) [8]
Зачем писать завершающий ноль вручную?
> Ketmar © (02.08.06 16:48) [13]
Почему?
← →
Ketmar © (2006-08-02 17:52) [18]> [17] begin...end © (02.08.06 17:42)
ноль -- по причине слабой памяти. %-) не уверен в том, что оно его само пропишет. а GetMem() память не обнуляет.
[13] -- потому что опять же, насколько я помню, PChar() иногда выделяет для строки временный буфер. но и тут могу наврать -- проверял давно. а Delphi дома. %-)
← →
Ketmar © (2006-08-02 17:53) [19]> [17] begin...end © (02.08.06 17:42)
ну и ещё: ноль потому, что "за время пути собака могла похудеть". хоть это и маловероятно.
← →
Tanya (2006-08-08 17:12) [20]Что-то у меня не компилится такой код:
var
pText: string;
TextLen: Integer;
...
TextLen := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
SetLength(pText, TextLen);
if TextLen > 0 then SendMessage(hwnd, WM_GETTEXT, TextLen + 1, LPARAM(PChar(pText)));
пишет: [Error] Unit1.pas(66): Missing operator or semicolon
Я и так пробовала: LPARAM(@pText[1]) вместо LPARAM(PChar(pText))
← →
Ketmar © (2006-08-08 18:02) [21]ошибка в 66-й строке, аднака.
← →
Tanya (2006-08-08 22:01) [22]да, на эту строку и показывает:
if TextLen > 0 then SendMessage(hwnd, WM_GETTEXT, TextLen + 1, LPARAM(PChar(pText)));
← →
Ketmar © (2006-08-08 22:22) [23]намекаю более прозрачно: 17-я строка.
← →
Tanya (2006-08-10 03:00) [24]Что-то я не пойму никак в чем ошибка...((( Курсор становится после слова "LPARAM(" перед PChar
← →
Tanya (2006-08-10 03:03) [25]Поменяла "LParam" на "Integer", т.е. сделала так и заработало:
var
pText: string;
TextLen: Integer;
...
TextLen := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
SetLength(pText, TextLen);
if TextLen > 0 then SendMessage(hwnd, WM_GETTEXT, TextLen + 1, Integer(PChar(pText)));
← →
Tanya (2006-08-10 15:21) [26]Интересно, почему с "Integer" работает а с "LParam" нет? Объясните плиз
← →
Ketmar © (2006-08-10 15:24) [27]17-я строка.
← →
Tanya (2006-08-10 15:46) [28]Блин, я не понимаю причем здесь 17-я строка...((( Ketmar, что там?
← →
clickmaker © (2006-08-10 15:49) [29]
> с "Integer" работает а с "LParam" нет?
с LParam тоже работает
← →
Tanya (2006-08-10 15:51) [30]странно, у меня даже не компилируется...(((
← →
Ketmar © (2006-08-10 15:58) [31]> [28] Tanya (10.08.06 15:46)
нет, а мне откуда знать, что в той строке? вот я и намекаю, что телепатор в ремонте.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.039 c