Главная страница
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 изменится? как найти тогда этот же объект...? а если есть два эдита в ктором изначально одно и тоже лежит?


 
Elen ©   (2006-09-21 15:22) [41]


> laronov

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


 
Ketmar ©   (2006-09-21 15:24) [42]

>[41] Elen(c) 06-09-21 15:22
>Наверное проблема в том, что в винде изначально
>не предусматривали легкого способа достучаться до
>компонентов
более того -- "в винде" и нет вовсе никаких "компонентов" (в дельфийском понятии).


 
Elen ©   (2006-09-21 15:26) [43]


> Ketmar

Это я образно... чего это микрососы не сделали такого?


 
Ketmar ©   (2006-09-21 16:03) [44]

>[43] Elen(c) 06-09-21 15:26
>Это я образно... чего это микрососы не сделали
>такого?
не знаю, чего "такого". всё, что надо, там есть.


 
laronov   (2006-09-21 16:55) [45]

Всем спасибо! разобрался :)))

теперь встал вопрос как вытащить данные из чужего DBGrid"а, на сколько я понимаю это совсем не тривиальная задача...?


 
Ketmar ©   (2006-09-21 16:59) [46]

>[45] laronov 06-09-21 16:55
>теперь встал вопрос как вытащить данные из чужего DBGrid"а             зачем? не проще их сразу из базы брать?


 
laronov   (2006-09-21 17:16) [47]


>   зачем? не проще их сразу из базы брать?

Дело в том, что база закрыта (т.е. доступ к ней есть только у этой программы). Взламывать ее или пытаться к ней подключиться просто нельзя.
то что проще- это я понимаю...


 
Боб   (2006-09-22 14:07) [48]

Если кого-то еще интересует как
взять данные из окна ЧУЖЕГО приложения :
есть еще такие API-функции (пояснения в Win SDK) ;
  GetClassName(H2, // handle of window
               P1 , // address of buffer for class name
               90  // size of buffer, in characters
               );
 Она выдает имя класса окна. Напр Р1=TEdit.

  GetWindowText(H2, // handle of window
                P2 , // address of buffer for class name
                90  // size of buffer, in characters
                );
 Смысл понятен. (она сама генерит WM_GETTEXT )
 В том же SDK написано :
 "This function cannot retrieve the text of an edit control in another application."
 То бишь - неззя!
 Однако, если чужая прога написана на Delphi, функция текст достает!
 А мне попалась "Сишная", из которой так и не удалось выдрать текст.
 У меня есть тестовый проектик (корявый, но работающий).
 Программа обегает все дочерние окна главного окна и пытается выдрать
 из них тексты.
 Могу выложить куда-нибудь, или прямо сюда, или на мыло...
 А если кому-то удалось справиться с "Сишником" - поделитесь
 пожалуйста опытом.
 С уважением. Боб


 
Сергей М. ©   (2006-09-22 14:18) [49]


> laronov   (21.09.06 17:16) [47]


> при помощи этой программы


Она случаем не являет собой COM/OLE-сервер автоматизации ? Может быть стоит проанализировать док-цию и имеющиеся модули на предмет сего, прежде чем пороть горячку ?
Я к тому, что решение задачи может лежать прямо под ногами и при этом не требовать ни взлома ни извращений а-ля сабж ..


 
laronov   (2006-09-25 10:29) [50]


> Она случаем не являет собой COM/OLE-сервер автоматизации
> ? Может быть стоит проанализировать док-цию и имеющиеся
> модули на предмет сего, прежде чем пороть горячку ?
> Я к тому, что решение задачи может лежать прямо под ногами
> и при этом не требовать ни взлома ни извращений а-ля сабж
> ..

нет, она обращается к оракловой базе напрямую....


 
Сергей М. ©   (2006-09-25 10:42) [51]


> laronov   (25.09.06 10:29) [50]


> она обращается к оракловой базе напрямую


Да хоть к господу богу пусть обращается "напрямую") ..
Вопрос, является ли та самая программа COM/OLE-сервером автоматизации, остается открым.


 
sniknik ©   (2006-09-25 11:13) [52]

никакая программа не может запретить доступ к базе админу (с правами админа)... если доступ юзеру всетаки запрешен (прав нет) и админ его не дает, а разрешает только работать в указаной программе (т.е. данные по какойто причине закрыты) то любые действия, что попытка конекта к базе, что снятие данных с окна программы будут взломом.
поэтому надо либо договариваться и делать нормально, либо оставить эту затею...


 
laronov   (2006-09-25 12:36) [53]


> никакая программа не может запретить доступ к базе админу
> (с правами админа)... если доступ юзеру всетаки запрешен
> (прав нет) и админ его не дает, а разрешает только работать
> в указаной программе (т.е. данные по какойто причине закрыты)
> то любые действия, что попытка конекта к базе, что снятие
> данных с окна программы будут взломом.
> поэтому надо либо договариваться и делать нормально, либо
> оставить эту затею...

Я думал что на этом форуме все-таки обсуждаеются технические возможности реализации той или иной идеи, а не какие-то моральные.

Если вас интересует зачем не это надо, то могу пояснить.
Есть база и программа, которую разработана для моей организации другая компания, давать доступ к базе они не хотят, а в договоре на разработку это не указано. мне же надо в другую базу заносить теже данные что и заносят в эту(при этом, когда заносят в эту базу данные, происходит поиск из соответствующих справочников, которые и отображаются в DBGrid).
т.о. данные - мои, а вот хранилище не мое, вот и пытаюсь уменьшить работу операторам, которым придется работать с двумя базами.


 
Сергей М. ©   (2006-09-25 12:47) [54]


> думал что на этом форуме все-таки обсуждаеются технические
> возможности реализации той или иной идеи


угу ... а ты при этом упорно не желаешь привести результаты своих исследований на возможность доступа к "чужой" программе средствами OLE/COM ..


> априори считается что извлекать данные из этой базы можно
> ТОЛЬКО при помощи этой программы


Кем считается ?
СУБД какая ?


 
laronov   (2006-09-25 12:50) [55]


> Кем считается ?
> СУБД какая ?

мной :)

СУБД - оракл


 
Сергей М. ©   (2006-09-25 12:56) [56]


> мной


Уф-ф-ф-ф ... уже легче... а то я уж было смирился с мыслью, что это было одним из постановлений ЦК ВЦСПС)


> оракл


И что ?
Ты не можешь подключиться к этой оракловой базе иными инструм.средствами, нежели та самая вражеская программа, которая "априори" не пущает тебя туда ?


 
laronov   (2006-09-25 13:02) [57]


> И что ?
> Ты не можешь подключиться к этой оракловой базе иными инструм.
> средствами, нежели та самая вражеская программа, которая
> "априори" не пущает тебя туда ?

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


 
Сергей М. ©   (2006-09-25 13:08) [58]


> по решению начальства было сказано либо через это программку,
>  либо никак


Ну тогда, с учетом того что начальству в зад не заглядывают, предлагаю альтернативу - перехват OracleAPI-вызовов со стороны вражеской программулины.


 
sniknik ©   (2006-09-25 13:48) [59]

laronov   (25.09.06 12:36) [53]
laronov   (25.09.06 13:02) [57]
в общем понятно, проблема надуманная, т.к. если вы купили программу и нигде особо не оговаривается то значит и база ваша, по другому просто не может быть. и не давать вам доступ "они" попросту не могут, не в их силах, это дело вашего админа (или ваше если вы за него).

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

и еще другое дело, что начальство не разбираясь в конкретно работе/тонкостях чаще всего запрещает все. от греха.

а вот ваше дело, как специалиста, обьяснить ему (начальству) что к чему и добится чтобы делать как надо/правильно, а не замороченно/нестабильно/хакерскими методами которые повредят основной программе гораздо скорее чем просто доступ к базе.

можете конечно и дальше пытатся "технически реализовывать ту или иную идею", но только чтобы те кто вам отвечает тоже понимали что эта реализация мягко говоря нестандартна/и не нужная в итоге.


 
sniknik ©   (2006-09-25 13:53) [60]

p.s. а вот если предположить что пишется не утильная прога, а прога шпион, перехватывающая ввод в эту прогу, то ваш подход оправдан (ни к начальству ни к админу уже не подойдеш...), но не законен...



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

Текущий архив: 2006.10.15;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.09 c
3-1155295013
Lexiy
2006-08-11 15:16
2006.10.15
Оптимизация запросов


6-1148051262
kernel
2006-05-19 19:07
2006.10.15
Противная ошибка


15-1159002956
Furyz
2006-09-23 13:15
2006.10.15
*.bat компиляция


15-1158851718
SPACE!!
2006-09-21 19:15
2006.10.15
Юмор На Компьютерную Тематику


1-1157272016
atruhin
2006-09-03 12:26
2006.10.15
Ипользование объекта вместо записи