Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];

Вниз

Как вытащить текст из эдита чужого окна???   Найти похожие ветки 

 
XM-AD   (2002-01-03 12:19) [0]

Хэндл окна узнать не проблема, равно как и хэндл эдита, а вот вытащить текст - проблематично... Не получается как при GetWindowText, так и при посылке сообщения " SendMessage"!!! Первый вообще ничего не возвращает, а второй, впрочем тоже ничего не возвращает.(Один раз правда вернул какую то чушь вроде этого ->"


 
Юрий Зотов   (2002-01-03 12:49) [1]

И GetWindowText, и WM_GETTEXT должны работать. Вероятно, они просто неверно используются. Приводите код.


 
Alx2   (2002-01-04 09:01) [2]

Может быть, это?
(SDK)
An application sends an EM_GETLINE message to copy a line of text from an edit control and place it in a specified buffer.

EM_GETLINE
wParam = (WPARAM) line; // line number to retrieve
lParam = (LPARAM) (LPCSTR) lpch; // address of buffer for line


 
Alx2   (2002-01-04 09:14) [3]

Вот, получилось!
Procedure TForm1.Panel1Click(Sender: TObject);
Var hwnd : THandle;
txt : String;
Begin
hwnd := $000201BE; // Каокй-то хэндл (Edit от Пуск->Выполнить)
SetLength(txt,100);
SendMessage(hwnd,WM_GETTEXT,100,Integer(txt));
sayIt(txt);
End;


 
Юрий Зотов   (2002-01-04 13:30) [4]

В строке SetLength(txt,100) вместо константы 100 советую использовать вызов GetTextLength.


 
Alx2   (2002-01-04 13:39) [5]

Согласен :))


 
XM-AD   (2002-01-08 15:50) [6]

А у меня все равно не работает:(

var n:integer;
win:THandle;
pt :TPoint;
strw:string;
p : PChar;
{предшествующий код, например определение позиции курсора и т.д.}
win:=WindowFromPoint(pt);
GetClassName(win,p,255);
if p="Edit" then
begin n:=GetWindowTextLength(win);
SendMessage(win,WM_GETTEXT,n,Integer(strw));
MessageBox(0,PChar(strw),"Edit",mb_OK);
end;
{конец нужной части кода}

MessageBox вылетает, но строки не содержит :( ПОЧЕМУ???


 
XM-AD   (2002-01-08 16:20) [7]

To Alx2: А Ваш пример я тоже не допонял :( Вставил вместо SayIt(txt); -> MessageBox(0,PChar(txt),"Edit",mb_OK); и удивился!!! - какой адрес я не ставля вместо $000201BE, везде выволдится только Panel1... Ну и еще (читай в коде) Объясните, пожалуйста!!! А то мне уже дурно :(


Procedure TForm1.Panel1Click(Sender: TObject);
Var hwnd : THandle;
txt : String;
Begin
hwnd := $000201BE; // Какой-то хэндл (Edit от Пуск->Выполнить)
//то же сомое и $300101BE и $040171BE и $00000000 и в принципе
//любой другой адрес :( кроме...
//ЕСЛИ подставить $FFFFFFF то в результате (т.е. в MessageBox-e
//выводится Program Manger (с одной стороны это радует, с
//другой - тупик превращается в кольцо :( Выход только сверху :(
SetLength(txt,100);
SendMessage(hwnd,WM_GETTEXT,100,Integer(txt));
MessageBox(0,PChar(txt),"Edit",mb_OK);
End;


 
XM-AD   (2002-01-09 18:35) [8]

Б.........лин. Такая казалось бы простая фигня, ан нет, не тут то было :( Я уже и с wParam & lParam пытался исхитриться [какого только черта, спрашивается :(] К сожалению я так и не смог вновь воспроизвести ту структуру, при которой хоть что-то выводилось (на это что-то можно посмотреть в самом начале), магическое зелье закончилось наверное :)
Вот почему CreateWindowEx для всех (вернее многих) элементов одинакова, а GetWindowText работает по разному!?
P.S. Как же я люблю Microsoft!!!


 
nikkie   (2002-01-10 12:08) [9]

попробую я объянить. кидаешь на форму Edit + Timer. пишешь обработчик таймера.


procedure TForm1.Timer1Timer(Sender: TObject);
var
h : HWND;
n : integer;
s : string;
begin
h := WindowFromPoint(Mouse.CursorPos);
if h <> 0 then begin
n := SendMessage(h, WM_GETTEXTLENGTH, 0, 0) + 1;
SetLength(s, n);
SendMessage(h, WM_GETTEXT, WPARAM(n), LPARAM(PChar(s)));
Edit1.Text := s;
end;
end;


ничего сложного нет - надо только внимательно читать документацию.

про GetWindowText SDK говорит:
This function cannot retrieve the text of an edit control in another application.

эксперимент показывает, что не только из edit control :)

то же самое в MSDN
However, GetWindowText cannot retrieve the text of a control in another application.

эксперимент показывает, что из некоторых контролей (например, button или static) все-таки вытаскивает :)

чудесны и неисповедимы пути MS! что там внутрях GetWindowText творится - неизвестно. но документация все же ясно говорит, что надо использовать WM_GETTEXT



 
XM-AD   (2002-01-10 14:17) [10]

To nikkie>> Золотце, где ж ты раньше то был(а) :)



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
14-19342
pasha_golub
2002-01-23 12:43
2002.03.07
---|Ветка была без названия|---


3-19087
DDDD
2002-02-08 10:16
2002.03.07
QuickRep


1-19245
Илья Лу.
2002-02-20 09:19
2002.03.07
DLL


1-19166
igorr
2002-02-21 15:59
2002.03.07
Копирование в буфер


1-19145
sammy
2002-02-07 08:53
2002.03.07
win sdk





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