|
안녕하세요 수야랍니다.
DLL을 이용해서 WM_PAINT를 후킹하시려구하시는거같네요..
이런 방법은 처음봐서 떨리는군요.. 무서워 ㅡㅡㅋ
일반적으로 MainForm에서 후킹을하게되죠 그리구 일반적으로 이렇게 후킹을하구요
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_PAINT, TWMPAINT, WMPAINT);
END_MESSAGE_MAP(TForm)
모든 멧시지는 message.hpp에 정의되어있구여 (맞나여? 아~ 간떨려 ㅡㅜ)
이런게 보통 빌더를 쓰시는 분들이 사용하시는 일반적인것이죠?
void __fastcall TForm1::WMEraseBkgnd(TWMEraseBkgnd &Msg)
{
Msg.Result = false;
}
Msg.wParam을 이용해서 윈도를 다시 그린다거나 여러가지를 하게되죠~?
그리구선 뭐 이런식으로 다시 그리기도하죠
이미 아신다구요? 흑 ㅡㅜ
찾아보셨겠지만 더 자세한 정보는 WM_PAINT의 도움말을 보시기 바랍니다. ㅡㅡ
허접 수야였습니다. (.. 허접질한거같아서 쓸쓸하당 ㅡㅜ )
^^ 님이 쓰신 글 :
:
: 안녕하세요.
:
: 요즈음 제가 고민에 빠졌습니다. 다름이 아니라 화면의 변경사항을 체크해 내야 하는데, 이것 저것 방법을 찾고 있습니다. 현재는 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 이벤트를 확인하면 엄청 많은데, 제 갈고리에는 걸리지 않습니다. 이유가 몰까요 ?
:
: 아시는 분, 도와 주시면 정말 감사하겠습니다.
:
:
|