박지훈.임프 님이 쓰신 글 :
: : 방금 [Lecture]란을 다녀 왔는데 유용한 팁들이 상당하더군요.
: :
: : Hooking에 관한 설명이나 간단한 예제는 없을까요? 시스템을
: : 의도하는 대로 제어하려다 보니까 Hooking에 관련된 부분이
: : 떡 버티고 있네요. 온라인 레퍼런스를 봐도 설명이 부실하고...
:
:
: 임펠리테리입니다.
:
: 미토프의 사이트(
http://members.xoom.com/mitov/)에서 들고 온겁니다.
:
: Catching messages of another object
:
: class TForm1 : public TForm
: {
: ......
: TMemo *Memo1;
: ......
: ......
: int (__stdcall *OldHookComponentProc) ();
: int (__stdcall *NewHookComponentProc) ();
: HWND OwnerHandle;
: ......
: ......
: void __fastcall HookComponentProc(TMessage &aMsg);
:
: void __fastcall HookComponent();
: void __fastcall UnhookComponent();
: ......
: ......
: __fastcall TForm1 (TComponent* _Owner) ;
: __fastcall ~TForm1();
: ......
: ......
: };
:
: //---------------------------------------------------------------------------
: __fastcall TForm1::TForm1 (TComponent* _Owner) :
: TCustomPanel(_Owner),
: NewHookComponentProc ( NULL )
: {
: HookComponent();
: }
: //---------------------------------------------------------------------------
: __fastcall TForm1::~TForm1()
: {
: if ( NewHookComponentProc )
: UnhookForm();
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::HookComponent()
: {
: OwnerHandle = Memo1->Handle;
:
: OldHookComponentProc = (int (__stdcall *)()) GetWindowLong(OwnerHandle, GWL_
: WNDPROC);
: NewHookComponentProc = (int (__stdcall *)()) MakeObjectInstance(HookComponen
: tProc);
:
: SetWindowLong(OwnerHandle, GWL_WNDPROC, (long) NewHookComponentProc);
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::UnhookComponent()
: {
: SetWindowLong(OwnerHandle, GWL_WNDPROC, (long) OldHookComponentProc);
: if (NewComponentFormProc)
: FreeObjectInstance(NewComponentFormProc);
:
: NewHookComponentProc = NULL;
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::HookComponentProc( TMessage &aMsg )
: {
: switch ( aMsg.Msg )
: {
: case WM_SHOWWINDOW:
: {
: // Memo1 -> WM_SHOWWINDOW .
: }
: case WM_SIZE:
: {
: // Memo1 -> WM_SIZE .
: }
: }
:
: // Default.
: aMsg.Result = CallWindowProc(OldHookFormProc, OwnerHandle,
: aMsg.Msg, aMsg.WParam, aMsg.LParam);
:
: }
: //---------------------------------------------------------------------------
:
: 그럼 참고하세요...
:
:
임펠리테리님~!
위의 소스는 훅이 아니라 Sub Classing에 관한 내용이네요..
즉, 메시지 핸들링하는 방법중에 하나라는 얘기입니다.
실제로 훅킹을 위해서는 SetWindowsHookEx() 또는 CallNextHookEx()등의 API를 사용하여 시스템 또는 쓰레드의 메시지를 훅킹합니다.
저도 이 훅킹에 관한 소스를 찾고 있던중에 여기에 이글을 쓰게 되었습니다.
그럼 이만...