Главная страница
    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.52 MB
Время: 0.04 c
15-1157633263
syte_ser78
2006-09-07 16:47
2006.09.24
функция date


2-1157368943
*Ray*
2006-09-04 15:22
2006.09.24
Запрос SQL


2-1157463917
VEZ
2006-09-05 17:45
2006.09.24
Ссылка не обнуляется.


2-1157009093
Yegorchic
2006-08-31 11:24
2006.09.24
Многострочные Item ы в ListView


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский