|
안녕하세요.
요즈음 제가 고민에 빠졌습니다. 다름이 아니라 화면의 변경사항을 체크해 내야 하는데, 이것 저것 방법을 찾고 있습니다. 현재는 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 이벤트를 확인하면 엄청 많은데, 제 갈고리에는 걸리지 않습니다. 이유가 몰까요 ?
아시는 분, 도와 주시면 정말 감사하겠습니다.
|