//共享数据段 #pragma data_seg("YCIShared") HWND g_hWndCaller=NULL; //保存主窗口句柄 HHOOK g_hHook = NULL; //保存钩子句柄 #pragma data_seg() // 这是导出变量的一个示例 KEYHOOK_API int nKeyHook=0;
// 这是导出函数的一个示例。 KEYHOOK_API int fnKeyHook(void) { return 42; }
//通过内存得到模块句柄的帮助函数 HMODULE WINAPI ModuleFromAddress(LPVOID pv) { MEMORY_BASIC_INFORMATION mbi; if (0 != ::VirtualQuery(pv, &mbi, sizeof(MEMORY_BASIC_INFORMATION))) { return (HMODULE)mbi.AllocationBase; } else { return NULL; } } //钩子处理函数 LRESULT CALLBACK KeyboardProc( __in int code, __in WPARAM wParam, __in LPARAM lParam ) { if (code<0||code==HC_NOREM) { return ::CallNextHookEx(g_hHook, code, wParam,lParam); } //如果重复消息,交给下一链 if (lParam & 0x40000000) { return ::CallNextHookEx(g_hHook, code, wParam,lParam); } //通知主窗口 :ostMessageA(g_hWndCaller, HM_KEY, wParam, lParam); return ::CallNextHookEx(g_hHook, code, wParam,lParam);
} //安装和卸载钩子函数 BOOL KEYHOOK_API WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller) { BOOL bRet = TRUE; g_hWndCaller = hWndCaller; if (bInstall) //安装钩子 { g_hHook =::SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, ModuleFromAddress(KeyboardProc), dwThreadId); bRet = (g_hHook != NULL); } else //卸载钩子 { ::UnhookWindowsHookEx(g_hHook); g_hHook = NULL; } return bRet; } // 这是已导出类的构造函数。 // 有关类定义的信息,请参阅 KeyHook.h CKeyHook::CKeyHook() { return; } .h头文件代码: 代码如下: // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 KEYHOOK_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // KEYHOOK_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef KEYHOOK_EXPORTS #define KEYHOOK_API __declspec(dllexport) #else #define KEYHOOK_API __declspec(dllimport) #endif
#define HM_KEY WM_USER + 100 // 此类是从 KeyHook.dll 导出的 class KEYHOOK_API CKeyHook { public: CKeyHook(void); // TODO: 在此添加您的方法。 };
extern KEYHOOK_API int nKeyHook;
KEYHOOK_API int fnKeyHook(void);
//声明要导出的 BOOL KEYHOOK_API WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId=0, HWND hWndCaller=NULL);
.def代码: 代码如下: EXPORTS SetKeyHook SECTIONS YCIShared Read Write Shared 希望本文所述对大家的C++程序设计有所帮助。 |