Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

взять данные из окна ЧУЖЕГО приложения [D7, WinXP]


Страницы:   1 2 3

laronov ©   (2006-09-20 12:23:00) 

Есть программа, которая берет данные из закрытой базы (априори считается что извлекать данные из этой базы можно ТОЛЬКО при помощи этой программы)
Пишется другая, СВОЯ, программа, в которой необходимо брать данные, отображенные в полях типа Edit или ComboBox ЧУЖЕЙ программы.

Знаю точно, что это можно как-то сделать, вопрос именно как?

Заранее спасибо за ответы.


laronov   (2006-09-21 12:32:00) [21]

Elen!
Большое спасибо! заработало после того, как  указал сколько надо возвращать символов...

толко я так и не понял, как работает

> FindWindowEx(Wnd,0,pchar('TEdit'),pchar('Edit123456'));

т.е. то что я указываю имя объекта - это его caption,
а что удет, когда caption изменится? как найти тогда этот же объект...? а если есть два эдита в ктором изначально одно и тоже лежит?


Elen   (2006-09-21 11:49:00) [22]


> laronov

кстати, Я ж говорю сырой код - кто бы обратил внимание что нужно вместо
SendMessage(edt,WM_GETTEXT,0, lparam(value));

писать
SendMessage(edt,WM_GETTEXT,255, lparam(value));

Т.Е. нужно 3-м параметром указывать скольк
о символов возворащать

типа такого :
edt:=Edit1.Handle;
if edt<>0 then
 SendMessage(edt,WM_GETTEXT,255, lparam(value));

 caption:=inttostr(edt)+' '+ value;


Elen   (2006-09-21 11:46:00) [23]


> возвращаются какие-то странные символы.

Потому что FindWindowEx вернуло 0. проверь...


Elen   (2006-09-21 11:41:00) [24]


> Наиль

Этот пример требует установки курсора мыши над элементом. А автору нужно автоматом получать контролы. ему нужно только унать имя нужного контрола - а вот это как раз проблемно


laronov   (2006-09-21 11:40:00) [25]

сделал в итоге так:


var
Wnd : HWND;
edt : HWND;value,p:pchar;
begin
edt:=0;
GetMem(value,255);
p:=pchar('Form1234');
  Wnd :=FindWindow(nil, p);
if wnd<>0 then edt:= FindWindowEx(Wnd,0,pchar('TEdit'),pchar('Edit123456'));
if edt<>0 then
  SendMessage(edt,WM_GETTEXT,0, lparam(LPCTSTR(value)));

  edit1.Text:= value;
end;


при этом окно имеет Caption 'Form1234'
эдит, из которого я пытаюсь вытащить текст - 'Edit123456'

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


Наиль   (2006-09-21 11:20:00) [26]


> т.е. получается что я могу сам вводить его имя? странно....

За пределами Delphi имён не существует


laronov   (2006-09-21 11:18:00) [27]


> Elen ©   (21.09.06 11:12) [32]
>
> > laronov
>
> Класс - Tedit имя - Edit1 (к примеру)

т.е. получается что я могу сам вводить его имя? странно....


Наиль   (2006-09-21 11:18:00) [28]

По твоей теме
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1158821345&n=0&web=1


Elen   (2006-09-21 11:12:00) [29]


> laronov

Класс - Tedit имя - Edit1 (к примеру)


Наиль   (2006-09-21 11:07:00) [30]

Чтобы понять принцип работы WM_GETTEXT исследуй TControl.DefaultHandler


laronov   (2006-09-21 11:03:00) [31]


> Elen ©   (21.09.06 11:02) [29]
>
> > laronov
>
> Класс - Tedit имя - Edit1 (к примеру)

так где имя-то взять?


Elen   (2006-09-21 11:02:00) [32]


> laronov

Класс - Tedit имя - Edit1 (к примеру)


laronov   (2006-09-21 11:01:00) [33]


> Elen ©   (21.09.06 10:57) [25]
>
> > laronov
>
> Все хендлы должна искать твоя прога а не ты сам вписывать.
>  Для этого там предусмотрено FindWindow[Ex]!

вопрос по этой процедуре...
там надо указывать класс и имя элемента, MS Spy++ показывает класс элемента, а вместо имени показывает текст, кторый в нем хранится.
таким образом имя элемента узнать не удастся... ?

а класс надо указывать как TEdit или Edit ?


laronov   (2006-09-21 10:58:00) [34]


> Все хендлы должна искать твоя прога а не ты сам вписывать.
>  Для этого там предусмотрено FindWindow[Ex]! А в своем примере
> ты от этого благополучно избавился. К тому же хендлы меняются
> от запуска к запуску

Это понятно, и я проверяю, что бы хендлы были актуальны, просто я решил отладить сначала одну часть... а потом уже и самому искать...


Elen   (2006-09-21 10:58:00) [35]


> laronov  

Это никуда не годится. Смотри внимательнее [1]


Elen   (2006-09-21 10:57:00) [36]


> laronov

Все хендлы должна искать твоя прога а не ты сам вписывать. Для этого там предусмотрено FindWindow[Ex]! А в своем примере ты от этого благополучно избавился. К тому же хендлы меняются от запуска к запуску


laronov   (2006-09-21 10:56:00) [37]


> Я ж говорю - сырой примерчик. Попробуй поменять разультат
> функции с variant на Pchar

попробовал с pchar'ом
получилось так:

function SendStringToAnotherComponent(Application, Element:integer):pchar;
var
Wnd : HWND;
edt : HWND;
p:pchar;
value : pchar;
begin
edt:=0;
GetMem(value,255);

if wnd<>0 then edt:= Element; //FindWindowEx(Wnd,0,'Edit','10');
if edt<>0 then
  SendMessage(edt,WM_GETTEXT,0, lparam(LPCTSTR(value)));
result:=value;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 edit1.Text:=(SendStringToAnotherComponent($007E06B0, $00CF0712));
end;



возращает по 2 символа... при том если онКлик выполнять несколько раз подряд, то совершенно разные....
(но тут наверное надо результат функции к стрингу привести... правда я не заню как...)


Наиль   (2006-09-21 10:56:00) [38]


> Чем же Pchar не устраивает?

Если Вы про это:
> ...написал правильное PChar(value).
> Это всё равно не сработало бы...

то поясняю, что Value без SetLength будет равно nil т.е. PChar(value) в [7] идентично PChar(nil).

PS. Лично меня PChar очень даже устраевает.

> я вот не понимаю, для чего нужен хендл окна, и вообще как
> его использовать.... т.к. в данном случае я использую только
> хендл объекта...

А он и не нужен.


laronov   (2006-09-21 10:53:00) [39]


> Наиль ©

добавил
SetLength(Value,255). и исправил LPCTSTR(@value[1]) на PChar(value).
начал возвращать один символ, который не понятно откуда берется....

хендлы беру при помощи MS Spy++

я вот не понимаю, для чего нужен хендл окна, и вообще как его использовать.... т.к. в данном случае я использую только хендл объекта...


Elen   (2006-09-21 10:40:00) [40]


> Наиль

Чем же Pchar не устраивает?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо