Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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>> Золотце, где ж ты раньше то был(а) :)




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




Наверх





Память: 0.73 MB
Время: 0.024 c
3-19090           DimaIv                2002-02-08 16:52  2002.03.07  
Возможно ли при помощи процедуры AppendRecord ничего


14-19309          asafr                 2002-01-14 13:00  2002.03.07  
Интересный, но закономерный факт?


6-19276           Aleksandr             2001-12-20 13:39  2002.03.07  
Как работать с посылкой сообщения по локальной сети?


6-19281           SemFLY                2001-12-09 03:15  2002.03.07  
Как всё-таки разшарить диск ! В FAQ всё смотрел !


1-19153           Roman_                2002-02-21 09:00  2002.03.07  
Как округлить 0.0294... до 0.3