全局键盘钩子

这是在系统的范围内截获键盘消息,所以需要全局键盘钩子,全局键盘钩子需要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,对于系统按键要用到:低级键盘钩子

发布了37 篇原创文章 · 获赞 12 · 访问量 9254

猜你喜欢

转载自blog.csdn.net/weixin_43265881/article/details/103778275
今日推荐