大家好,又见面了,我是你们的朋友全栈君。
这是在系统的范围内截获键盘消息,所以需要全局键盘钩子,全局键盘钩子需要DLL文件的支持,这样系统才能把DLL强行的加载到进程中去。建立一个新的DLL文件,在DllMain()函数所在的CPP中添加:
定义两个全局变量:钩子句柄和DLL模块句柄。
HHOOK g_Hook = NULL;
HINSTANCE g_Instance = NULL;
在DllMain函数中保存DLL模块句柄,安装钩子SetWindowsHookEx()参数需要用到。
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,LPVOID lpReserved)
{
g_Instance = (HINSTANCE)hModule; //保存DLL模块句柄
return TRUE;
}
键盘钩子函数,调用约定为_stdcall:
LRESULT _stdcall KeyboradProc(int code ,WPARAM wParam,LPARAM lParam)
{
if (code < 0)
{
return CallNextHookEx(g_Hook,code,wParam,lParam);
}
if (code == HC_ACTION&&lParam>0)
{
char Buffer[10] = { 0 };
GetKeyNameText(lParam,(LPWSTR)Buffer,10);
MessageBox(NULL,(LPCWSTR)Buffer,NULL,MB_OK);
}
return CallNextHookEx(g_Hook, code, wParam, lParam);
}
如果code的值小于0,则必须调用CallNextHookEx()并返回它的值,不对这个消息进行处理。MSDN是让这么干的。
如果code == HC_ACTION&&lParam>0 则表示消息中含有键盘消息,且按键信息有值,然后读取内容。
安装和卸载钩子函数:
VOID SetHook()
{
//普通的键盘钩子 最后一个参数为NULL全局钩子
g_Hook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboradProc,g_Instance,NULL);
}
VOID UnSetHook()
{
UnhookWindowsHookEx(g_Hook);
g_Hook = NULL;
}
最后建一个MFC程序或者黑窗口程序也行,MFC的话加载SetHook()函数和UnSetHook()函数后关联到两个按钮中去,效果是这个样子的:
但是普通的键盘钩子对一些系统按键没有效果,例如截屏键PrtSc,对于系统按键要用到:低级键盘钩子
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132050.html原文链接:https://javaforall.cn