Форум: "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