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

Вниз

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

 
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 вся ветка

Текущий архив: 2002.03.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
4-19397
Dimaond Cat
2002-01-08 00:50
2002.03.07
SetWindowpos не срабатывает так как надо


1-19147
Igor_
2002-02-21 10:36
2002.03.07
Переключение между MDI- Child


1-19158
vint
2002-02-21 13:24
2002.03.07
как правильно описать функцию


7-19361
Прикольщик
2001-12-03 21:05
2002.03.07
Буду орать до тех пор пока хоть кто нибудь не откликнется! Люди добрые помогите!


1-19200
MK
2002-02-16 18:28
2002.03.07
Форма на весь экран