Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.102 c
15-1159026946
Alx2
2006-09-23 19:55
2006.10.15
"Раздумья ездового волка"


2-1159367523
Sam Stone
2006-09-27 18:32
2006.10.15
вызов "приплюснутой" функции


15-1158745989
Benchmark
2006-09-20 13:53
2006.10.15
Сколько выжимает ваш проц?


3-1155197685
rsa_
2006-08-10 12:14
2006.10.15
TntUnicodeControls... не получается то, что необходимо


2-1159446298
pavel_guzhanov
2006-09-28 16:24
2006.10.15
как просуммировать значения одного поля по условию





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