|
별다른 답변이 없어서 다시 질문 올립니다.
아시는 분은 제발 좀 알려 주십시오. 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;
}
}
//---------------------------------------------------------------------------
|