前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全局键盘钩子

全局键盘钩子

作者头像
全栈程序员站长
发布2022-06-30 19:51:40
7140
发布2022-06-30 19:51:40
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

这是在系统的范围内截获键盘消息,所以需要全局键盘钩子,全局键盘钩子需要DLL文件的支持,这样系统才能把DLL强行的加载到进程中去。建立一个新的DLL文件,在DllMain()函数所在的CPP中添加:

定义两个全局变量:钩子句柄和DLL模块句柄。

代码语言:javascript
复制
HHOOK g_Hook = NULL;
HINSTANCE g_Instance = NULL;

在DllMain函数中保存DLL模块句柄,安装钩子SetWindowsHookEx()参数需要用到。

代码语言:javascript
复制
BOOL APIENTRY DllMain( HMODULE hModule,    DWORD  ul_reason_for_call,LPVOID lpReserved)
{
	
	g_Instance = (HINSTANCE)hModule;  //保存DLL模块句柄

	return TRUE;
}

键盘钩子函数,调用约定为_stdcall:

代码语言:javascript
复制
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 则表示消息中含有键盘消息,且按键信息有值,然后读取内容。

安装和卸载钩子函数:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档