Главная страница
    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.63 MB
Время: 0.046 c
15-1159093206
TUser
2006-09-24 14:20
2006.10.15
PowerPoint


1-1157442128
speaker_avi
2006-09-05 11:42
2006.10.15
вопрос о monthcalendar


11-1135150285
Lari
2005-12-21 10:31
2006.10.15
Перехват нажатия кнопки в заголовке программы


15-1158817956
DelphiLexx
2006-09-21 09:52
2006.10.15
нужен пакет для решения нелинейных задач


2-1158566852
vodvorezlaya
2006-09-18 12:07
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский