// dllHookkb.cpp : Defines the entry point for the DLL application.<br />//<br />#include "stdafx.h"<br />#include "dllHookkb.h"</p><p>#ifdef _MANAGED<br />#pragma managed(push, off)<br />#endif<br />#pragma data_seg("YCIShared2010")<br />HWND g_hWndCaller = NULL;<br />HHOOK g_hHook = NULL;<br />#pragma data_seg()<br />BOOL APIENTRY DllMain( HMODULE hModule,<br /> DWORD ul_reason_for_call,<br /> LPVOID lpReserved<br /> )<br />{<br />switch (ul_reason_for_call)<br />{<br />case DLL_PROCESS_ATTACH:<br />case DLL_THREAD_ATTACH:<br />case DLL_THREAD_DETACH:<br />case DLL_PROCESS_DETACH:<br />break;<br />}<br /> return TRUE;<br />}<br />#ifdef _MANAGED<br />#pragma managed(pop)<br />#endif<br />// This is an example of an exported variable<br />DLLHOOKKB_API int ndllHookkb=0;<br />// This is an example of an exported function.<br />DLLHOOKKB_API int fndllHookkb(void)<br />{<br />return 42;<br />}<br />// This is the constructor of a class that has been exported.<br />// see dllHookkb.h for the class definition<br />CdllHookkb::CdllHookkb()<br />{<br />return;<br />}<br />//通過記憶體位址取得模組控制代碼的函數<br />HMODULE WINAPI ModuleFromAddress(PVOID pv)<br />{<br />MEMORY_BASIC_INFORMATION mbi;<br />if (::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)<br />{<br />return (HMODULE)mbi.AllocationBase;<br />}<br />else<br />{<br />return NULL;<br />}<br />}<br />//鍵盤鉤子函數<br />LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)<br />{<br />if (nCode < 0 || nCode == HC_NOREMOVE)<br />{<br />return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);<br />}<br />if (lParam & 0x40000000)//重複的訊息交給下一個hook鏈<br />{<br />return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);<br />}<br />//通知主視窗,wParam參數為虛擬鍵碼,lParam參數包含了此鍵的資訊<br />::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam);</p><p>return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);<br />}<br />//安裝,卸載鉤子的函數<br />DLLHOOKKB_API BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)<br />{<br />BOOL bOk;</p><p>g_hWndCaller = hWndCaller;<br />if (bInstall)<br />{<br />g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, ModuleFromAddress(KeyHookProc), dwThreadId);<br />bOk = (g_hHook != NULL);<br />}<br />else<br />{<br />bOk = ::UnhookWindowsHookEx(g_hHook);<br />g_hHook = NULL;<br />}<br />return bOk;<br />}<br />