Текущий архив: 2006.10.15;
Скачать: CL | DM;
Внизвзять данные из окна ЧУЖЕГО приложения Найти похожие ветки
← →
laronov (2006-09-20 12:23) [0]Есть программа, которая берет данные из закрытой базы (априори считается что извлекать данные из этой базы можно ТОЛЬКО при помощи этой программы)
Пишется другая, СВОЯ, программа, в которой необходимо брать данные, отображенные в полях типа Edit или ComboBox ЧУЖЕЙ программы.
Знаю точно, что это можно как-то сделать, вопрос именно как?
Заранее спасибо за ответы.
← →
Elen © (2006-09-20 12:47) [1]Попробуй так : код сыроват, так что пусть мастера его посмотрят
Application - капшн или Хендл того приложения
NameElement - Имя элемента на форме
ClassElement - Его классfunction SendStringToAnotherComponent(Application:variant;NameElement,ClassElement):varia nt;
var // Copy Rights by Default from Delphi Master Site
Wnd : HWND;
edt : HWND;value,p:pchar;
begin
edt:=0;
GetMem(value,255);
if VarIsStr(Application) then p:=pchar(VarToStr(Application));
Wnd :=FindWindow(nil, p); // íàõîäèì îêíî
if VarIsNumeric(Application) then wnd:=Application;
if wnd<>0 then edt:= FindWindowEx(Wnd,0,pchar(ClassElement),pchar(NameElement));
if edt<>0 then
SendMessage(edt,WM_GETTEXT,0, lparam(LPCTSTR(value)));
result:=value;
end;
//**************************************************************************
← →
laronov (2006-09-20 12:57) [2]
> Application - капшн или Хендл того приложения
> NameElement - Имя элемента на форме
> ClassElement - Его класс
а как узнать (особенно имя элемента) их и в каком формате пишется класс....
← →
Elen © (2006-09-20 13:21) [3]
> laronov
Spy++ тебе в помощь
← →
Весь в делах (2006-09-20 13:34) [4]
> laronov
В королевстве есть несколько замечательных статей. Топай и читай.
← →
laronov (2006-09-20 14:14) [5]
> В королевстве есть несколько замечательных статей. Топай
> и читай.
вопрос как искать? т.е. как это все сформулировать так, что бы в поиск засунуть...
Сам когда-то давно видел на королевстве
← →
Весь в делах (2006-09-20 14:42) [6]http://www.google.ru/search?as_q=%D0%BF%D1%80%D0%BE%D0%B3%D1%83%D0%BB%D0%BA%D0%B0+%D0%BF%D0%BE+%D0%BE%D0%BA%D0%BD%D0%B0%D0%BC&as_sitesearch=http%3A%2F%2Fwww.delphikingdom.com
← →
laronov (2006-09-20 16:16) [7]сдела по образу и подобию http://64.233.161.104/search?q=cache:W8AUNsPg_QwJ:www.delphirus.com.ru/modules.php%3Fname%3DPages%26pa%3Dshowpage%26pid%3D1463+SendMessage+WindowHandle+WM_GETTEXT&hl=ru&ct=clnk&cd=1
function SendStringToAnotherComponent(Application, Element:integer):string;
var
Wnd : HWND;
edt : HWND;
p:pchar;
value :string;
begin
edt:=0;
if VarIsNumeric(Application) then wnd:=Application;
//Wnd :=FindWindow(nil, p);
if wnd<>0 then edt:=Element;
if edt<>0 then
SendMessage(edt,WM_GETTEXT,0, lparam(LPCTSTR(@value[1])))
else MessageDlg("hendl = 0", mtInformation,
[mbOk], 0);
result:=value;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text:=SendStringToAnotherComponent($00AC0944, $007C0808);
end;
но в итоге ничего не получается... возвращается пустая строка...
← →
Сергей М. © (2006-09-20 16:20) [8]
> ничего не получается... возвращается пустая строка
потому что "образ и подобие" - откровеннейшая галиматья, в которой ты даже не удосужился разобраться, где-что-как-почему там происходит
← →
laronov (2006-09-20 16:34) [9]
> SendMessage(edt,WM_GETTEXT,0, lparam(LPCTSTR(@value[1])))
ну а где у меня тут ошибка? беру хендл TEdit"а и при помощи SendMessage пытаюсь вытащить значение из того эдита...
← →
evvcom © (2006-09-21 08:26) [10]> [9] laronov (20.09.06 16:34)
Куда вытащить?
← →
laronov (2006-09-21 09:26) [11]
> Куда вытащить?
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> edit1.Text:=SendStringToAnotherComponent($00AC0944, $007C0808);
>
> end;
в свой edit....
← →
Наиль © (2006-09-21 09:31) [12]
> ($00AC0944, $007C0808);
До чего числа красивые.
И с чего ты взял, что они верные на момент выполнения программы?
← →
Virgo_Style © (2006-09-21 09:39) [13]laronov (20.09.06 16:16) [7]
Прокомментируйте, пожалуйста, каждую строчку. Ну, напримерif VarIsNumeric(Application) then wnd:=Application;
//Здесь я проверяю переменную типа Integer, не стала ли она случайно Variant"ом с нечисловым значением. Это сделано специально для того, чтобы получить warning о неинициализированном Wnd.
и так далее. Начиная с заголовка функции.
← →
laronov (2006-09-21 09:41) [14]
> До чего числа красивые.
> И с чего ты взял, что они верные на момент выполнения программы?
>
потому что я смотрю MS Spy++
я, правда, не понял зачем я передаю хендл самого окна, т.е. как его использовать...
← →
Наиль © (2006-09-21 09:57) [15]
>@value[1]
Ужас!
← →
Elen © (2006-09-21 10:10) [16]
> laronov
Не хило примерчик [1] перековеркали...
← →
laronov (2006-09-21 10:20) [17]
> Не хило примерчик [1] перековеркали...
так он совсем не работал... :(
вместо того что бы критиковать, лучше бы посоветовали, где я ошибся...
← →
laronov (2006-09-21 10:21) [18]
> Наиль © (21.09.06 09:57) [15]
>
> >@value[1]
>
> Ужас!
в первом примереresult:=value;
не работает, делфи не дает возвращать pchar
← →
Elen © (2006-09-21 10:32) [19]
> laronov
Я ж говорю - сырой примерчик. Попробуй поменять разультат функции с variant на Pchar
← →
Наиль © (2006-09-21 10:36) [20]
> [18] laronov (21.09.06 10:21)
Выпишем строчки в которых встречается value;value :string; // читать как value:="", а точнее value=nil;
SendMessage(edt,WM_GETTEXT,0, lparam(LPCTSTR(@value[1])))
// читать как SendMessage(edt,WM_GETTEXT,0, lparam(LPCTSTR(@nil[1])))
result:=value; // Теперь это уже не важно
Даже если бы ты вместо LPCTSTR(@value[1]) написал правильное PChar(value).
Это всё равно не сработало бы, так как WM_GetText предполагает, что ты подготовил место в памяти для хранения полученых данных. Для этого в [1] есть GetMem(Value,255); что в твоём случае должно записыватся как SetLength(Value,255).
← →
Elen © (2006-09-21 10:40) [21]
> Наиль
Чем же Pchar не устраивает?
← →
laronov (2006-09-21 10:53) [22]
> Наиль ©
добавил
SetLength(Value,255). и исправил LPCTSTR(@value[1]) на PChar(value).
начал возвращать один символ, который не понятно откуда берется....
хендлы беру при помощи MS Spy++
я вот не понимаю, для чего нужен хендл окна, и вообще как его использовать.... т.к. в данном случае я использую только хендл объекта...
← →
Наиль © (2006-09-21 10:56) [23]
> Чем же Pchar не устраивает?
Если Вы про это:
> ...написал правильное PChar(value).
> Это всё равно не сработало бы...
то поясняю, что Value без SetLength будет равно nil т.е. PChar(value) в [7] идентично PChar(nil).
PS. Лично меня PChar очень даже устраевает.
> я вот не понимаю, для чего нужен хендл окна, и вообще как
> его использовать.... т.к. в данном случае я использую только
> хендл объекта...
А он и не нужен.
← →
laronov (2006-09-21 10:56) [24]
> Я ж говорю - сырой примерчик. Попробуй поменять разультат
> функции с 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 символа... при том если онКлик выполнять несколько раз подряд, то совершенно разные....
(но тут наверное надо результат функции к стрингу привести... правда я не заню как...)
← →
Elen © (2006-09-21 10:57) [25]
> laronov
Все хендлы должна искать твоя прога а не ты сам вписывать. Для этого там предусмотрено FindWindow[Ex]! А в своем примере ты от этого благополучно избавился. К тому же хендлы меняются от запуска к запуску
← →
Elen © (2006-09-21 10:58) [26]
> laronov
Это никуда не годится. Смотри внимательнее [1]
← →
laronov (2006-09-21 10:58) [27]
> Все хендлы должна искать твоя прога а не ты сам вписывать.
> Для этого там предусмотрено FindWindow[Ex]! А в своем примере
> ты от этого благополучно избавился. К тому же хендлы меняются
> от запуска к запуску
Это понятно, и я проверяю, что бы хендлы были актуальны, просто я решил отладить сначала одну часть... а потом уже и самому искать...
← →
laronov (2006-09-21 11:01) [28]
> Elen © (21.09.06 10:57) [25]
>
> > laronov
>
> Все хендлы должна искать твоя прога а не ты сам вписывать.
> Для этого там предусмотрено FindWindow[Ex]!
вопрос по этой процедуре...
там надо указывать класс и имя элемента, MS Spy++ показывает класс элемента, а вместо имени показывает текст, кторый в нем хранится.
таким образом имя элемента узнать не удастся... ?
а класс надо указывать как TEdit или Edit ?
← →
Elen © (2006-09-21 11:02) [29]
> laronov
Класс - Tedit имя - Edit1 (к примеру)
← →
laronov (2006-09-21 11:03) [30]
> Elen © (21.09.06 11:02) [29]
>
> > laronov
>
> Класс - Tedit имя - Edit1 (к примеру)
так где имя-то взять?
← →
Наиль © (2006-09-21 11:07) [31]Чтобы понять принцип работы WM_GETTEXT исследуй TControl.DefaultHandler
← →
Elen © (2006-09-21 11:12) [32]
> laronov
Класс - Tedit имя - Edit1 (к примеру)
← →
Наиль © (2006-09-21 11:18) [33]По твоей теме
http://delphimaster.net/view/1-1158821345/&web=1
← →
laronov (2006-09-21 11:18) [34]
> Elen © (21.09.06 11:12) [32]
>
> > laronov
>
> Класс - Tedit имя - Edit1 (к примеру)
т.е. получается что я могу сам вводить его имя? странно....
← →
Наиль © (2006-09-21 11:20) [35]
> т.е. получается что я могу сам вводить его имя? странно....
За пределами Delphi имён не существует
← →
laronov (2006-09-21 11:40) [36]сделал в итоге так:
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"
но все равно ничего дельного не получается - возвращаются какие-то странные символы...
← →
Elen © (2006-09-21 11:41) [37]
> Наиль
Этот пример требует установки курсора мыши над элементом. А автору нужно автоматом получать контролы. ему нужно только унать имя нужного контрола - а вот это как раз проблемно
← →
Elen © (2006-09-21 11:46) [38]
> возвращаются какие-то странные символы.
Потому что FindWindowEx вернуло 0. проверь...
← →
Elen © (2006-09-21 11:49) [39]
> 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;
← →
laronov (2006-09-21 12:32) [40]Elen!
Большое спасибо! заработало после того, как указал сколько надо возвращать символов...
толко я так и не понял, как работает
> FindWindowEx(Wnd,0,pchar("TEdit"),pchar("Edit123456"));
т.е. то что я указываю имя объекта - это его caption,
а что удет, когда caption изменится? как найти тогда этот же объект...? а если есть два эдита в ктором изначально одно и тоже лежит?
Страницы: 1 2 вся ветка
Текущий архив: 2006.10.15;
Скачать: CL | DM;
Память: 0.59 MB
Время: 0.045 c