// dllHookkb.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "dllHookkb.h" #ifdef _MANAGED #pragma managed(push, off) #endif #pragma data_seg("YCIShared2010") HWND g_hWndCaller = NULL; HHOOK g_hHook = NULL; #pragma data_seg() 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: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } #ifdef _MANAGED #pragma managed(pop) #endif // This is an example of an exported variable DLLHOOKKB_API int ndllHookkb=0; // This is an example of an exported function. DLLHOOKKB_API int fndllHookkb(void) { return 42; } // This is the constructor of a class that has been exported. // see dllHookkb.h for the class definition CdllHookkb::CdllHookkb() { return; } //通过内存地址取得模块句柄的函数 HMODULE WINAPI ModuleFromAddress(PVOID pv) { MEMORY_BASIC_INFORMATION mbi; if (::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) { return (HMODULE)mbi.AllocationBase; } else { return NULL; } } //键盘钩子函数 LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode < 0 || nCode == HC_NOREMOVE) { return ::CallNextHookEx(g_hHook, nCode, wParam, lParam); } if (lParam & 0x40000000)//重复的消息交给下一个hook链 { return ::CallNextHookEx(g_hHook, nCode, wParam, lParam); } //通知主窗口,wParam参数为虚拟键码,lParam参数包含了此键的信息 ::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam); return ::CallNextHookEx(g_hHook, nCode, wParam, lParam); } //安装,卸载钩子的函数 DLLHOOKKB_API BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller) { BOOL bOk; g_hWndCaller = hWndCaller; if (bInstall) { g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, ModuleFromAddress(KeyHookProc), dwThreadId); bOk = (g_hHook != NULL); } else { bOk = ::UnhookWindowsHookEx(g_hHook); g_hHook = NULL; } return bOk; }