// installs an application-defined hook procedure into a hook chain.
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
typedef void (* LPFN_INITHOOK)(HOOKPROC lpfnCallBackHookProc, int idHook);
LPFN_INITHOOK lpfnInitHook;
typedef void (* LPFN_UNHOOK)(void);
LPFN_UNHOOK lpfnUnHook;
CuDllManager DllManager;
BOOL bLoadDll = DllManager.LoadLibrary(L"HookDll.dll");
lpfnInitHook = (LPFN_INITHOOK)DllManager.GetProcAddress("InitHook");
lpfnUnHook = (LPFN_UNHOOK)DllManager.GetProcAddress("UnHook");
lpfnInitHook(HookProc, WH_MOUSE_LL);
lpfnUnHook();
// HookDll.h
#ifdef HOOKDLL_EXPORTS
#define HOOKDLL_API __declspec(dllexport)
#else
#define HOOKDLL_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
HOOKDLL_API void InitHook(HOOKPROC lpfnCallBackHookProc, int idHook );
HOOKDLL_API void UnHook(void);
#ifdef __cplusplus
} // extern "C"
#endif //__cplusplus
// HookDll.cpp
#pragma comment(linker,"/SECTION:.MYSEC,RWS")
#pragma data_seg(".MYSEC")
HOOKPROC g_lpfnCallBackHookProc = NULL;
HHOOK ghHook = NULL;
#pragma data_seg()
HMODULE ghModule;
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
ghModule = hModule;
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
UnHook();
ghHook = NULL;
break;
}
return TRUE;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if ( nCode < 0 )
return ::CallNextHookEx(ghHook, nCode, wParam, lParam);
if( nCode == HC_ACTION )
{
if( g_lpfnCallBackHookProc )
g_lpfnCallBackHookProc(nCode, wParam, lParam);
}
return ::CallNextHookEx(ghHook, nCode, wParam, lParam);
}
HOOKDLL_API void InitHook(HOOKPROC lpfnCallBackHookProc, int idHook )
{
g_lpfnCallBackHookProc = lpfnCallBackHookProc;
ghHook = (HHOOK)::SetWindowsHookEx(idHook, HookProc, ghModule ,0);
}
HOOKDLL_API void UnHook(void)
{
::UnhookWindowsHookEx(ghHook);
}
先包一層DLL, Hook群組無法傳任何資料進去, 看樣子每一個執行緒, 對同一個Hook 只能掛一次, 後面在自己做函式指標輪詢吧!
回覆刪除data_seg 比較特別資料要共用時得放到這裡來! Ex: ghHook
回覆刪除