Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Вытащить текст из дочернего окна   Найти похожие ветки 

 
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://predskazanie-wunschpunsch.ru/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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.033 c
3-1153747299
VALUA
2006-07-24 17:21
2006.09.24
DBGRID - как поместить графическое изображение в колонку


15-1157088870
Ega23
2006-09-01 09:34
2006.09.24
С Днём рождения! 1 сентября


1-1155123140
Stanislav
2006-08-09 15:32
2006.09.24
Нажата ли клавиша Shift


2-1157095583
Троль
2006-09-01 11:26
2006.09.24
использование Dll из ресурса


15-1157386489
Вти
2006-09-04 20:14
2006.09.24
Image1