C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[16130] [global hook] 화면에 변경된 사항을 제 프로그램에서 확인하고자 할때...
^^ [] 1139 읽음    2002-03-08 21:52
별다른 답변이 없어서 다시 질문 올립니다.
아시는 분은 제발 좀 알려 주십시오. please~.

현재 제가 모니터 상의 변경사항을 제 프로그램에서 알아내고자 합니다. 그러기 위해서는 아무래도 WM_PAINT 메세지를 가로채는 것이 가장 확실한 방법일 것 같아서 global hook을 시도하게 되었습니다. 일단은 hookking (갈고리질)은 이상없이 잘 됩니다.
그런데 문제는 현재 제 프로그램에서 발생하는 WM_PAINT만 가로챈다는 것입니다. 그러면 시스템 전체에 걸쳐 global hook을 할 이유가 없지 않습니까 ?
혹시나 하는 생각에 hooking type을 바꾸어 보았지만, (제가 파악한 바로는) WM_PAINT 메세지를 가로채는 형태는 WH_GETMESSAGE type밖에 없더군요. (혹, 시스템 전체에 걸쳐 WM_PAINT 메세지를 가로채는 type이 있습니까 ?)

현재 의심되는 것은,
1. 제가 WM_PAINT 메세지를 가로채는 갈고리 형태(hook type)을 못찾았다.
2. LoadLibrary 한 후, 갈고리질이 끝나야 free화 합니다. 근데, 그것이 아니고, 갈고리질 하라고 해 놓고 바로 free화 해 주어야 하나요 ? (갈고리질을 하라고 하고 바로 풀어버리면 오류가 나던데 이는 메모리상에 갈고리질을 set한 것이 없어서 그럴거라 생각되거든여. 그래서 갈고리질이 끝날때까지 가지고 있어야 되지 싶은데... 어째든 의심이 갑니다. 내가 잡고 있어서 다른 프로그램들이 이 갈고리를 올리지 못하는 건 아닌지... 하는 의심.)

VC의 스파이(spy)나 BC의 WinSight는 모든 메세지를 잘도 잡아내던데...
아시는 분은 조금의 힌트라도....

좋은 하루 되세요.




------------------------
DLL source
------------------------
typedef struct
{
     HWND      hWnd;                // hook master main form handle
     HHOOK    lock_KBD;          // lock keyboard hook handle
     HHOOK    mnt_CRT;            // monitoring screen hook handle

} HookData;
HookData      gHD = {0, };

extern "C" __export __stdcall bool Set_Mnt_CRT (HWND mainWnd, HINSTANCE hInst);
extern "C" __export __stdcall bool Unset_Mnt_CRT (void);





//---------------------------------------------------
extern "C" __export __stdcall bool Set_Mnt_CRT (HWND mainWnd, HINSTANCE hInst)
{
     bool result = false;
     gHD.hWnd      = mainWnd;
//      gHD.mnt_CRT = SetWindowsHookEx (WH_CALLWNDPROC, (HOOKPROC) Hook_Mnt_CRT, hInst, 0);
     gHD.mnt_CRT = SetWindowsHookEx (WH_GETMESSAGE, (HOOKPROC) Hook_Mnt_CRT, hInst, 0);
     result = (bool) gHD.mnt_CRT;

     WriteData (&gHD);
     return result;
}
//---------------------------------------------------
extern "C" __export __stdcall bool Unset_Mnt_CRT (void)
{
     if ( gHD.mnt_CRT == 0 )   ReadData (&gHD);
     return UnhookWindowsHookEx (gHD.mnt_CRT);
}
//---------------------------------------------------
//   monitoring screen hook function
//---------------------------------------------------
LRESULT CALLBACK Hook_Mnt_CRT (int code, WPARAM wParam, LPARAM lParam)
{
     if ( gHD.mnt_CRT == 0 || gHD.hWnd == 0 )      // global variable 동기화
           ReadData (&gHD);

//      if ( code >= 0 )
     if ( code == HC_ACTION && wParam == PM_REMOVE )
     {
           if ( ((MSG*)lParam)->message == WM_PAINT )
           {
                 PostMessage (gHD.hWnd, WM_USER+kChanged_CRT, 0, 0);
           }
     }
     return   CallNextHookEx (gHD.mnt_CRT, code, wParam, lParam);
}



------------------------
APP source
------------------------
HINSTANCE    gHInst_Mnt_CRT;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     bool (__stdcall* Set_Mnt_CRT)(HWND, HINSTANCE);

     gHInst_Mnt_CRT = LoadLibrary ("hookDll.dll"); // 이 dll을 바로 free 시키지 않고 갈고리질이 끝나는 시점에서 free화 합니다. 이것이 문제가 될 수 있나요?

     Set_Mnt_CRT = (bool (__stdcall*)(HWND, HINSTANCE)) GetProcAddress(gHInst_Mnt_CRT, "Set_Mnt_CRT");
     if ( Set_Mnt_CRT (Handle, gHInst_Mnt_CRT) )
     {
           Button1->Enabled = false;
           Button2->Enabled = true;
     }
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
16130 [global hook] 화면에 변경된 사항을 제 프로그램에서 확인하고자 할때... ^^ 1139 2002/03/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.