Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.048 c
15-1156958567
Chort
2006-08-30 21:22
2006.09.24
Умер Игорь Кио.


1-1155388106
apic
2006-08-12 17:08
2006.09.24
TListView


2-1157419680
Ref
2006-09-05 05:28
2006.09.24
Excel


2-1157017070
BronOS
2006-08-31 13:37
2006.09.24
доступ к объекту на форме MDI Child


15-1157452423
Konstantin555
2006-09-05 14:33
2006.09.24
HELP! Как разблокировать CD-ROM?!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский