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
[16099] [global hook] WM_PAINT 이벤트를 가로채고 싶은데...
^^ [] 2447 읽음    2002-03-07 22:55

안녕하세요.

요즈음 제가 고민에 빠졌습니다. 다름이 아니라 화면의 변경사항을 체크해 내야 하는데, 이것 저것 방법을 찾고 있습니다. 현재는 global hook을 이용하여 시스템 전역에서 발생하는 WM_PAINT 메세지를 가로챌려고 하고 있습니다. 근데, 뜻대로 잘 않되네요.

일단, 시스템 전역에 걸친 hook(갈고리)는 완성이 되었습니다. 그런데, WM_PAINT 메세지 정확하게 잡히지를 않네요. 일단 소스를 보시는 것이 좋을 듯...

------------------------
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 ( ((CWPSTRUCT*)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");

    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;
    }
}
//---------------------------------------------------------------------------

이렇게 되어 있을 때, 여러가지 시도를 해 보았는데, 다른 메세지(WM_ACTIVATE 같은 것)은 정상적으로 자기 것, 남의 것 가리지 않고 다 가져 오는데, WM_PAINT는 자기 것만 가져 옵니다. 그것도 가끔씩만 가져 옵니다. spy를 띄워 놓고 발생하는 WM_PAINT 이벤트를 확인하면 엄청 많은데, 제 갈고리에는 걸리지 않습니다. 이유가 몰까요 ?

아시는 분, 도와 주시면 정말 감사하겠습니다.


+ -

관련 글 리스트
16099 [global hook] WM_PAINT 이벤트를 가로채고 싶은데... ^^ 2447 2002/03/07
16106     Re:허접이 고수님의 질문의 뜻이 이해못하고 올리는 답변일까 겁나네요 수야 1451 2002/03/08
16109         Re:Re:허접이 고수님의 질문의 뜻이 이해못하고 올리는 답변일까 겁나네요 ^^ 1238 2002/03/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.