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

Вниз

Как считать текст из чужого edit   Найти похожие ветки 

 
ocean   (2004-11-24 17:28) [0]

А можно ли прочитать текст из edit чужого приложения?


 
xAnjel ©   (2004-11-24 19:15) [1]

http://www.delphimaster.ru/articles/winapi/index.html


 
Leonid Troyanovsky   (2004-11-24 21:58) [2]


> ocean   (24.11.04 17:28)  
> А можно ли прочитать текст из edit чужого приложения?


Вообще-то - нельзя. Но, если очень хочется, то можно.
Скажем, WM_GETTEXT. Если, конечно, это действительно edit.

--
С уважением, LVT.


 
Dimaxx ©   (2004-11-24 22:10) [3]

API-функция GetWindowText


 
Piter ©   (2004-11-24 22:19) [4]

Вопрос: как прочитать заголовок или Edit из чужого окна

Ответ: воспользоваться функией:

function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer; stdcall;

hWnd - указатель на окно (Edit тоже окно)
lpString - адрес буфера для сохранения результата
MaxCount - максимальное число символов, которые можно записать в буфер, включая завершающий символ

Сама функция возвращает число символов, которые записаны в буфер, исключая завершающий символ.
Чтобы узнать сколько нужно выделять места под буфер перед тем, как вызвать GetWindowText и передать адрес буфера, можно воспользоваться функцией:

function GetWindowTextLength(hWnd: HWND): Integer; stdcall;

которая возвращает число символов в заголовке окна по переданному указателю окна

Для примера можно кинуть на форму таймер и в обработчике написать:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 s: string;
 i: integer;
 pt: TPoint;
 Handle: HWND;
begin
 GetCursorPos(pt); // узнаем координаты курсора мышки
 Handle := WindowFromPoint(pt); // узнаем указатель на окно, который находится под курсором мышки

 i := GetWindowTextLength(Handle); // узнаем размер заголовка в символах
 SetLength(s, i); // выделяем место под буфер
 GetWindowText(Handle, PChar(s), i+1); // узнаем непосредственно текст заголовка

 Edit1.Text := s; // выводим текст заголовка в Edit
end;

Можете запустить программу и посмотреть как меняется значение в Edit при передвижении курсора мыши по экрану и наведению на различные окна.

Отвечал: Piter


 
Игорь Шевченко ©   (2004-11-25 01:03) [5]

Piter ©   (24.11.04 22:19) [4]

The GetWindowText function copies the text of the specified window"s title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application.

This function cannot retrieve the text of an edit control in another application

Отвечал: http://msdn.microsoft.com


 
Piter ©   (2004-11-25 22:06) [6]

Игорь Шевченко ©   (25.11.04 1:03) [5]

понимаю... но почему тогда он все таки зачастую возвращает текст в edit?

И как тогда оффициально узнать текст в чужом edit?


 
Leonid Troyanovsky   (2004-11-26 10:24) [7]


> Piter ©   (25.11.04 22:06) [6]

> понимаю... но почему тогда он все таки зачастую возвращает
> текст в edit?



Случайность ;)


> И как тогда оффициально узнать текст в чужом edit?


:)
SendMessage(h, WM_GETTEXT,..);

--
С уважением, LVT.


 
Piter ©   (2004-11-26 19:30) [8]

Leonid Troyanovsky   (26.11.04 10:24) [7]
SendMessage(h, WM_GETTEXT,..);


Хм, просто в хелпе есть:

GetWindowText
This function causes a WM_GETTEXT message to be sent to the specified window or control.

Я думал это одно и тоже. И все таки, почему GetWindowText зачастую возвращает текст в Edit? От чего зависит - сработает или нет?


 
Leonid Troyanovsky   (2004-11-29 15:39) [9]


> Piter ©   (26.11.04 19:30) [8]
 
> GetWindowText
> This function causes a WM_GETTEXT message to be sent to
> the specified window or control.
>
> Я думал это одно и тоже. И все таки, почему GetWindowText
> зачастую возвращает текст в Edit? От чего зависит - сработает
> или нет?


> I find it interesting
> that the help says GetWindowText uses WM_GETTEXT
>

It is not telling the whole truth. GetWindowText uses WM_GETTEXT but it is
not sending it via SendMessage, it tries to directly call the target
windows window proc with it. That is the part that does not work if the
window is in another process.

Peter Below (TeamB)  100113.1101@compuserve.com)


 
Piter ©   (2004-11-29 16:42) [10]

Leonid Troyanovsky   (29.11.04 15:39) [9]
GetWindowText


спасибо! Только вопрос остается ведь - Peter Below пишет так, что получается GetWindowText никогда не сработает на чужом окне. А на самом деле она зачастую отрабатывает нормально на чужих окнах.
Почему? Не все так просто, видимо...

А как насчет GetWindowTextLength? Она вроде всегда нормально возвращает длину?


 
jack128 ©   (2004-11-29 19:02) [11]

Piter ©   (29.11.04 16:42) [10]
А на самом деле она зачастую отрабатывает нормально на чужих окнах.

Иногда срабатывает, а иногда нет.  Ну нафиг такая функция нужна? используй WM_GETTEXT и будет те счастье.

Piter ©   (29.11.04 16:42) [10]
А как насчет GetWindowTextLength? Она вроде всегда нормально возвращает длину?

при передаче текста из другого приложения проблема в том что нам нужно скопировать информацию из одного вап в другой. А получить длину текста мы можем в результате обработки сообщения. GetWindowText просто вызывает оконную процедуру и не выполняет копирорвания памяти из одного процесса в другой, потому и не может работать с окнамми в других приложениях. А вот WM_GETTEXT выполняет такое копирование (ОБС используется механизм MMF)..

Все вышесказанное - мои домыслы, но не думаю, что они далеки от реальности ;-) В любом случае Рихтер нас рассудит.


 
Piter ©   (2004-11-29 19:29) [12]

jack128 ©   (29.11.04 19:02) [11]
GetWindowText просто вызывает оконную процедуру и не выполняет копирорвания памяти из одного процесса в другой


если это было бы так - то функция GetWindowText никогда бы не срабатывала. То есть, она в одном случае копирует, в другом нет... интересно :)


 
jack128 ©   (2004-11-29 21:54) [13]

Piter ©   (29.11.04 19:29) [12]
нет, ты не понял.  

вот код

begin
 SetLength(s, GetWindowTextLength(Wnd));
 GetWindowText(Wnd, PChar(s), Length(s));
end;

условный код GetWindowText, если верно [9]

function GetWindowText(Wnd: Handle; P: PChar; MaxLen: Integer): Integer;
var
 WndProc: Pointer;
begin
 WndProc := Pointer(GetWindowLong(Wnd), GWL_WNDPROC));
 Result := CallWindowProc (WndProc, Wnd, WM_GETTEXT, MaxLen, Integer(p));
end;

теперь как выглядит обработчик WM_GETTEXT ? Да 99% вот так

function WndProc(Wnd: THandle; Msg, WParam, LParam: Integer): Integer;
begin
 case Msg of
   WM_GETTEXT:
     begin
       StrLCopy(PChar(LParam), FText, WParam);
       Result := Min(StrLen(FText), WParam);
     end;
   ....
 end;
end;

Где в FText - указатель на строку заголовка.  Но ведь этот указатель в ВАП того процесса, которому пренадлежит окно Wnd, не того процесса в котором вызывается оконная процедура, функция GetWindowText. А вот в этом вап, по этому адресу может находится все что угодно.


 
Piter ©   (2004-11-29 23:43) [14]

jack128 ©   (29.11.04 21:54) [13]

если ты прав - то какова вероятность верного определения заголовка с помощью GetWindowText в чужом окне?

А у меня на некоторых окнах определяется 100%. на некоторых не определяется. Это и странно.


 
Xaker ©   (2004-11-30 00:23) [15]

Piter ©   (29.11.04 23:43) [14]
у меня в  всегда определяла :))  (я не замечал, чтобы глючила)


 
jack128 ©   (2004-11-30 01:06) [16]

Piter ©   (29.11.04 23:43) [14]
какова вероятность верного определения заголовка с помощью GetWindowText в чужом окне?


Без понятия. Я не знаю, я лишь высказал гипотизу. На практике у меня нет никакого желания исследовать этот вопрос, мне вполне достаточно фразы This function cannot retrieve the text of an edit control in another application из хелпа к GetWindowText и отсутствия этой фразы в хелпе к WM_GETTEXT, чтобы сделать вывод ;-)


 
Leonid Troyanovsky   (2004-11-30 10:31) [17]


Piter ©   (29.11.04 16:42) [10]

> спасибо! Только вопрос остается ведь - Peter Below пишет
> так, что получается GetWindowText никогда не сработает на
> чужом окне. А на самом деле она зачастую отрабатывает нормально
> на чужих окнах.
> Почему? Не все так просто, видимо...
>
> А как насчет GetWindowTextLength? Она вроде всегда нормально
> возвращает длину?


Возможно, что насчет конкретного механизма Peter не совсем
прав, но даже в msdn можно найти намеки на то, что
GetWindowText на самом деле не использует SendMessage.
Каким должен быть edit, чтобы GWT не сработало я не знаю.
Но точно помню, что на некоторых - не срабатывает :)

Ну, а GetWindowTextLength я предпочту WM_GETTEXTLENGTH:
и использовать не сложнее и четко представляешь,
что происходит.

Т.е., придерживаюсь правила: если контрол чужой,
то  только  SendMessage (PostMessage).
Особенно, если это те контролы, которых не было в win3.x

--
С уважением, LVT.


 
Piter ©   (2004-11-30 11:21) [18]

Leonid Troyanovsky   (30.11.04 10:31) [17]
то  только  SendMessage (PostMessage).


а каким образом можно использовать PostMessage для посылки WM_GETTEXT? Как же ты узнаешь, что текст записан и записан ли вообще...


 
Leonid Troyanovsky   (2004-11-30 13:19) [19]


> Piter ©   (30.11.04 11:21) [18]
> то  только  SendMessage (PostMessage).

> а каким образом можно использовать PostMessage для посылки
> WM_GETTEXT? Как же ты узнаешь, что текст записан и записан
> ли вообще...


Я имел ввиду любые чужие контролы, и не только WM_GETTEXT.
В случае EDIT это может быть, например, WM_CHAR.

--
С уважением, LVT.



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

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

Наверх





Память: 0.51 MB
Время: 0.034 c
14-1104181424
Кудесник
2004-12-28 00:03
2005.01.16
Ура!!! Я на GPRS!!!


4-1101395871
Kair
2004-11-25 18:17
2005.01.16


1-1104314800
grigory
2004-12-29 13:06
2005.01.16
Crystal reports в DELPHI!


1-1103923596
Drema
2004-12-25 00:26
2005.01.16
вывод информации


1-1104831644
Dammit
2005-01-04 12:40
2005.01.16
Как создать обработчик события при нажатии на кнопки Развернуть?





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