全局键盘钩子

全局键盘钩子这是在系统的范围内截获键盘消息,所以需要全局键盘钩子,全局键盘钩子需要DLL文件的支持,这样系统才能把DLL强行的加载到进程中去。建立一个新的DLL文件,在DllMain()函数所在的CPP中添加:定义两个全局变量:钩子句柄和DLL模块句柄。HHOOKg_Hook=NULL;HINSTANCEg_Instance=NULL;在DllMain函数中保存DLL模块句柄,安装…

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

这是在系统的范围内截获键盘消息,所以需要全局键盘钩子,全局键盘钩子需要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.net/132050.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c# List去重

    c# List去重需求:对List集合中的元素去重。实现:有三种方式可以使用-使用Linq中distinct()方法-借助hashset-使用for循环遍历,这种方法在数据量大时,运行速度比较慢代码示例使用distinct()//使用distinct()List<string>lst1=newList<string>(){“as”,”lio”,”sdrf”,”asd”,”lio”};varr.

    2022年5月9日
  • mybatis log激活码【永久激活】

    (mybatis log激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/ide…

    2022年3月21日
  • 扫雷游戏网页版_两个在线版复古小游戏,嗯还是熟悉的味道!「建议收藏」

    扫雷游戏网页版_两个在线版复古小游戏,嗯还是熟悉的味道!「建议收藏」今天给大家推荐两个轻松的网站,其实是两个在线的小游戏网站,分分钟让你找回许久之前的回忆,我们一起来看看吧。01、在线俄罗斯方块网址:http://www.webgame.org.cn看到上图的画面,已经无需多说什么了,“上了年纪”的小伙伴肯定都玩过这个吧,经典中的经典。这个网页的还原度也很高,可以通过键盘控制,老Y也就玩了两个小时而已~02、在线扫雷网址:http://www.saolei.org…

    2022年10月31日
  • CAN总线传输协议[通俗易懂]

    CAN总线传输协议[通俗易懂]一、控制器局域网总线(CAN,ControllerAreaNetwork)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线、同轴电缆或光纤来传输信号,因其高性能、高可靠性和高实时性等特点,已经成为了世界上应用最广泛的现场总线之一。公元1991年,CAN总线技术规范(CANVersion2.0)制定并发布,该技术规范共包括A和B两部分,称为CAN2.0A和CAN2.0B。其中CAN2.0…

    2022年6月28日
  • airplay影像_播放ftp服务器的视频

    airplay影像_播放ftp服务器的视频http://bbs.weiphone.com/read-htm-tid-1785042.htmliOS客户端软件:AirPlayer[支持RMVB,MKV,MP4,AVI等等格式],另外有个PulgPlayer不支持RMVBMKV等等格式。PC端媒体服务器:WIN7自带的媒体中心(论坛有设置方法的教程,这不介绍了)…

    2022年9月16日
  • Matlab2017a/b激活license.lic文件[通俗易懂]

    Matlab2017a/b激活license.lic文件[通俗易懂]网络下载的matlab2017a安装好之后激活遇到license.lic不可用的问题,由于2017a的激活文件更新了,我将激活文件直接替换成2017b的完成了激活成功教程。将激活文件拷贝到matlab安装目录中license文件夹内。license.lic文件内容(可直接复制到文本文件,将后缀改成.lic)INCREMENTAerospace_BlocksetM…

    2022年7月26日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号