#include #include #include #include #include #include extern "C" { __declspec(dllexport) bool FAR PASCAL unHook(void); __declspec(dllexport) bool FAR PASCAL setHook(void); } LRESULT CALLBACK callWndHookProc(int nCode,WPARAM wParam,LPARAM lParam); void handleMessage(UINT message,HWND hwnd,WPARAM wParam,LPARAM lParam); HHOOK smhHook=(HHOOK)0; File outFile("d:\log.txt","wb"); HINSTANCE hModuleInst; BOOL _stdcall DllMain(HINSTANCE hDLLInst,DWORD dwReason,LPVOID lpReserved) { switch(dwReason) { case DLL_PROCESS_ATTACH : hModuleInst=hDLLInst; ::printf("Process attach: 0x%08lx\n",hModuleInst); break; case DLL_PROCESS_DETACH : ::printf("Process detach\n"); break; case DLL_THREAD_ATTACH : ::printf("Thread attach\n"); break; case DLL_THREAD_DETACH : ::printf("Thread detach\n"); break; default : break; } return TRUE; } bool FAR PASCAL setHook(void) { smhHook=::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)&callWndHookProc,hModuleInst,0); return smhHook?true:false; } bool FAR PASCAL unHook() { if(!smhHook)return false; ::UnhookWindowsHookEx(smhHook); smhHook=0; return true; } LRESULT CALLBACK callWndHookProc(int nCode,WPARAM wParam,LPARAM lParam) { LRESULT result=0; CWPSTRUCT *pCWPSTRUCT=(CWPSTRUCT*)lParam; printf("callWndHookProc\n"); handleMessage(pCWPSTRUCT->message,pCWPSTRUCT->hwnd,pCWPSTRUCT->wParam,pCWPSTRUCT->lParam); if(nCode<0)return result=::CallNextHookEx(smhHook,nCode,wParam,lParam); return result; } void handleMessage(UINT message,HWND hwnd,WPARAM wParam,LPARAM lParam) { String outLine; outLine.reserve(256); ::sprintf(outLine.str(),"MESSAGE:%ld HWND:0x%08lx WPARAM:%d LPARAM:%ld",message,hwnd,wParam,lParam); outFile.writeLine(outLine); outFile.flush(); }