![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
взять данные из окна ЧУЖЕГО приложения [D7, WinXP]
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 не устраивает?