Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Внедрить контрол на чужое окно [D7, WinXP]


Страницы:   1 2

Cobalt ©   (2008-07-25 11:09:00) 

Ситуация: есть готовая программа (Д7), чужая, разработчик недоступен.
Необходимо её "немножко дополнить".
Программа - одна форма с полями ввода, по этим полям формирует 4 Doc-файла.

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

Помнится, как-то можно было связать контрол с простым окном через хендл, SetParent или что-то в этом роде.

Кто лучше в теме - подтвердите или пните в нужном направлении.


Leonid Troyanovsky   (2008-07-28 14:57:00) [1]


> Cobalt   (28.07.08 13:38) [37]

> Блин, функцию свою назначил через SetWindowLong, вижу, что
> кнопка обрабатывает своё WM_LBUTTONUP

Субклассировать надо окно парента, и отлавливать там WM_COMMAND
этой кнопки. Только звать надо не DefWindowProc, а старую WndProc.

Я ж уже говорил, что и сабклассировать не надо, ведь WM_COMMAND is
sending, т.е., ее можно поймать в хуке CALLWNDPROC.

И еще, выкинь нах TButton, CreateWindow* only.

--
Regards, LVT.


Cobalt   (2008-07-28 13:38:00) [2]

Блин, функцию свою назначил через SetWindowLong, вижу, что кнопка обрабатывает своё WM_LBUTTONUP, но она не отрисовывается :(((
function MyWndProc(HWindow: HWnd; Msg, WParam: Longint;
 LParam: Longint): Longint; stdcall;
begin
  if (HWindow=Button.Handle) AND (Msg=WM_LBUTTONUP)
  then  begin
         MessageBox(0,'Нажата кнопка','',0);
         Result:=0;
        end
  Else Result:=DefWindowProc(HWindow, Msg, WParam, LParam);
end;

Причём, если функцию не назначать, то она отрисовывается.

Вопрос - как заставить её обрабатывать прочие сообщения?


Сергей М.   (2008-07-28 08:21:00) [3]


> внедрившись в чужое АП Дельфовой программы, написанное в
> той же версии, можно подхватить там Application через хендл
> главного окна,


Можно. Но осторожно)


Cobalt   (2008-07-26 09:45:00) [4]

HHOOK SetWindowsHookEx(
   int idHook, // type of hook to install
   HOOKPROC lpfn, // address of hook procedure
   HINSTANCE hMod, // handle of application instance
   DWORD dwThreadId  // identity of thread to install hook for
  );


Германн   (2008-07-26 02:58:00) [5]


> Cobalt   (26.07.08 01:43) [33]
>
> Никак. ибо реагирует одна программа - избранная. На которую
> я поставил хук.
>

Эээ. А это как? Хук вроде ставится на некое событие/сообщение Винды. Как можно поставить хук на "одну программу"?


Cobalt   (2008-07-26 01:43:00) [6]

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

Кстати, прога написана тоже в Д7, почему я и думал, что обойдется проще - помню, обсуждали как-то, что, внедрившись в чужое АП Дельфовой программы, написанное в той же версии, можно подхватить там Application через хендл главного окна, и тогда заработает родной обработчик сообщений, все дела...


Сергей М.   (2008-07-25 21:51:00) [7]

Мне вот еще один "ништяк" интересен  - а как прочие процессы реагируют на твой шприц ?


Cobalt   (2008-07-25 21:13:00) [8]

Это инструмент, удобный для различных задач:
1-ый хук - для внедрения в АП процесса-жертвы, в нем закрепляем нашу длл-ку при помощи LoadLibrary. После этого хук снимается, т.к. цель - внедриться - выполнена.
2-й хук (предположительный пока) - для слежения за сообщениями, которые предназначены нашему контролу.

Как видно, ничего сложного нет :)


Сергей М.   (2008-07-25 21:04:00) [9]


> Cobalt   (25.07.08 20:46) [29]


Что тебя на хуках залинило-то ?
Непонятно ..
Мало ли способов заствить жертву родить) ..


Cobalt   (2008-07-25 20:46:00) [10]

2 Сергей М. ©
Вы уж простите, но Рихтера я уже прочитал ;)

2 Leonid Troyanovsky ©   (25.07.08 18:02) [26]
спасибо за идею - вспомнил, как диспетчеризуются сообщения в VCL. посмотрю, как бы прикрутить свою Wndproc к Батону.
Если не получится, тогда конечно, придется ставить другой хук, для перехвата сообщения кнопке.


Сергей М.   (2008-07-25 19:23:00) [11]


> гружу я её из хука для того, чтобы после снятия хука длл-
> ка осталась в АП программы, куда я внедрился и ничего не
> грохнулось с AV


Кулибин)

Тебе не кнопки в чужие проги тыкать, а за буквари садиться)


Leonid Troyanovsky   (2008-07-25 18:11:00) [12]


> Cobalt   (25.07.08 17:34) [25]

> А внедрена-то либа только на время хука, а после снятия
> хука будет выгружена (1 раз)

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

--
Regards, LVT.


Leonid Troyanovsky   (2008-07-25 18:02:00) [13]


> Cobalt   (25.07.08 17:13) [22]

> дело в том, что мне нужна кнопочка на чужой форме

Изволь, пусть будет, мы ж  против.

Только, обрабатывать надо не какой-то ButtonClick,
а WM_COMMAND оной кнопы, в хуковой процедуре.

Да и, во-ще,  дисциплинировать себя надо- никаких TButton,
CreateWindow* only.

--
Regards, LVT.


Cobalt   (2008-07-25 17:34:00) [14]

2 Сергей М. ©  
А внедрена-то либа только на время хука, а после снятия хука будет выгружена (1 раз)


Cobalt   (2008-07-25 17:31:00) [15]

Прошу прощения, правильный код рутины
Function AddHoc:integer;
 begin
    LoadLibrary('hook_dll1.dll');
  // та та длл-ка, в которой мой хук сидит.
гружу я её из хука для того, чтобы после снятия хука длл-ка осталась в АП программы, куда я внедрился и ничего не грохнулось с AV.
    WordDM:=TWordDM.Create(nil); //DataModule, просто чтобы было от кого прицепить обработчик, см. объявление ниже
    MainFormWnd:=FindWindowEx(0,0,'TForm1','Form1');
    Button:=TButton.CreateParented(MainFormWnd);
    Button.Visible:=false;
    //Result:=Integer(Button);
    Button.Name:='MyPrint';
    Button.Caption:='ПТС и страховка';
    Button.Left:=375;
    Button.Top:=532;
    Button.Width:= 121;
    Button.Height := 25;
    Button.OnClick:=WordDM.ButtonClick;
    Button.Visible:=True;
    Result:=Button.Handle;
 end;

type
 TWordDM = class(TDataModule)
   WordApplication1: TWordApplication;
 public
   procedure ButtonClick(Sender: TObject);
 end;

procedure TWordDM.ButtonClick(Sender: TObject);
begin
  MessageBox(0,'+++','',0);
end;


Вот теперь кнопка видна, но при нажатии ничего не происходит :(


Сергей М.   (2008-07-25 17:17:00) [16]


> LoadLibrary('hook_dll1.dll');


А это тогда что за зверь ?
Что за либу с подозрительным названием hook_dll1 ты грузишь в то время как хук-либа уже внедрена ?


Cobalt   (2008-07-25 17:13:00) [17]

2 Сергей М. ©   (25.07.08 16:08) [16]
Это код в ДЛЛ-ке.
ведь иначе в чужой АП хуком не внедриться.

2 Leonid Troyanovsky ©  
дело в том, что мне нужна кнопочкана чужой форме

Итак, кнопочка видна, но отчего-то не реагирует на нажатие :(

если кому интересно:
1) Ставлю хук (hook_dll1)
SetWindowsHookEx(WH_CALLWNDPROC, @SysMsgProc, HInstance, THID);
2) При первом же срабатывании вызывает внедряльщик:
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
 Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
  if not GlobalData^.Installed
  then begin
       GlobalData^.Installed:=true;
       AddHoc();
       end;
end;

3) Внедрение:
procedure AddHoc();
 begin
    LoadLibrary('hook_dll1.dll');
    Button:=TButton.CreateParented(MainFormWnd);
    Button.Visible:=false;
    Button.Name:='MyPrint';
    Button.Caption:='ПТС и Страховка';
    Button.Left:=375;
    Button.Top:=532;
    Button.Width:= 121;
    Button.Height := 25;
    Button.OnClick:=WordDM.ButtonClick;
    Button.Visible:=True;
 end;


Leonid Troyanovsky   (2008-07-25 16:43:00) [18]


> Сергей М. ©   (25.07.08 16:30) [20]

> Для чужого процесса код хук-модуля, который система влупила
> в его АП, как ни крути, "родным" не назовешь)

Будем звать побратимом.

> И потом, контрол следует создавать именно в ходе иниц-ции
> хук-модуля в АП "жертвы", а не так как делает автор.

А хз что есь AddHoc. Конечно, LoadLibrary выглядит подозрительно,
но, может в этом есть некий сермяжный смысл.

--
Regards, LVT.


Сергей М.   (2008-07-25 16:30:00) [19]


> Leonid Troyanovsky ©   (25.07.08 16:23) [19]


Так ведь хукже !

Для чужого процесса код хук-модуля, который система влупила в его АП, как ни крути, "родным" не назовешь)

И потом, контрол следует создавать именно в ходе иниц-ции хук-модуля в АП "жертвы", а не так как делает автор.


Leonid Troyanovsky   (2008-07-25 16:23:00) [20]


> Сергей М. ©   (25.07.08 15:52) [13]
>
> Я к тому что "чужое" приложение понятия не имеет, что делать
> с этим неожиданно свалившимся на нее "счастьем" в виде невесть
> откуда взявшихся в ее хозяйстве контролов.

Почему не будет? Дочернее окно будет создано тем же первичным
потоком - примет ака родное. Если хук на CALLWNDPROC -
даже сабклассировать не потребуется.

--
Regards, LVT.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо