VC++键盘钩子demo

VC++键盘钩子demoHHOOKkeyHook=NULL;//先声明函数,实现在下面LRESULTCALLBACKkeyProc(intnCode,WPARAMwParam,LPARAMlParam);//初始化钩子,关闭键盘事件(除了ALT+CTRL+DELETE)voidinitHook(){ keyHook=SetWindowsHookEx(WH_KEYBOARD_LL,keyProc,GetModuleHandle(NULL),0);}//销毁钩子voidun.

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

HHOOK keyHook = NULL;


//先声明函数,实现在下面
LRESULT CALLBACK keyProc(int nCode, WPARAM wParam, LPARAM lParam);

//初始化钩子,关闭键盘事件(除了ALT+CTRL+DELETE)
void initHook()
{
	keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, GetModuleHandle(NULL), 0);
}

//销毁钩子
void unHook()
{
	if (keyHook)
	{
		UnhookWindowsHookEx(keyHook);
	}
}


//钩子用的函数
LRESULT CALLBACK keyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	//在WH_KEYBOARD_LL模式下lParam 是指向KBDLLHOOKSTRUCT类型地址
	KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
	//如果nCode等于HC_ACTION则处理该消息,如果小于0,则钩子子程就必须将该消息传递给 CallNextHookEx
	if (nCode == HC_ACTION) 
	{
		if (pkbhs->vkCode == VK_ESCAPE)
		{
			CLogHelp::ITCLog("keyProc---->Esc");
			if (g_pthisDlg)
			{
				CLogHelp::ITCLog("Closescreen_FULL");
				g_pthisDlg->Closescreen_FULL();
			}
		}
		else if (pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(VK_SHIFT) & 0x8000) {
			//qDebug() << "Ctrl+Shift+Esc";
		}
		else if (pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000) 
		{
			//qDebug() << "Ctrl+Esc";
		}
		else if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN) 
		{
			CLogHelp::ITCLog("Alt+Tab ");
		}
		else if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags &LLKHF_ALTDOWN)
		{
			CLogHelp::ITCLog("Alt+Esc");
		}
	
		else if (pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN) 
		{
			CLogHelp::ITCLog("VK_LWIN vs VK_RWIN ");
		}
		else if (pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN) 
		{
			CLogHelp::ITCLog("Alt+F4 ");
		}
		else if (pkbhs->vkCode == VK_F1 && pkbhs->flags &LLKHF_ALTDOWN) 
		{
			CLogHelp::ITCLog("Alt+F1 back room ");
			unHook();
		}
		else if (pkbhs->vkCode == VK_F1)
		{
			CLogHelp::ITCLog("F1 Key press ");
		}

		return 1;//返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递
	}
	return CallNextHookEx(keyHook, nCode, wParam, lParam);
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130227.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • alibaba fastjson jsonarray转list[通俗易懂]

    alibaba fastjson jsonarray转list[通俗易懂]Stringavatar=teacherEntity.getAvatar();if(!StringUtils.isEmpty(avatar)){List<JSONObject>list=JSONObject.parseArray(avatar,JSONObject.class);Stringava=(String)list.get(0).get(“filePath”);tea

  • POJ 2704 && HDU 1208 Pascal’s Travels (基础记忆化搜索)[通俗易懂]

    POJ 2704 && HDU 1208 Pascal’s Travels (基础记忆化搜索)[通俗易懂] Pascal’sTravelsTimeLimit:1000MS   MemoryLimit:65536K TotalSubmissions:5328   Accepted:2396  DescriptionAnnxngameboardispopulatedwithintegers,onenonnegative…

  • 压缩文件的加密与破解

    压缩文件的加密与破解压缩文件的加密与破解0x00前言0x01过程1.压缩文件的加密注意点:2.压缩文件的解密0x00前言这是我对压缩文件的加密与破解的学习记录。0x01过程1.压缩文件的加密安装Winzip、Winrar软件进行加密在建好的文档右键—-&gt;添加到压缩文件—-&gt;选择rar/zip—-&gt;高级—-&gt;设置密码注意点:1.尽量不要使用Winra…

  • 手把手教你打造一个企业级实时数据中台【万字图文】「建议收藏」

    手把手教你打造一个企业级实时数据中台【万字图文】「建议收藏」引言——首先来聊聊现代企业数据架构及痛点:数据孤岛:低效率和利用困难的根源应用瓶颈:传统方案数据仓库、数据湖的不足 单讲这两个问题你可能会疑惑——为什么会出现这样的问题? 所以下面来讲讲两个实际的例子来细讲一下这两个问题:第一部分——两个实际的场景例子引入1.以航空公司的场景为例:  航空公司的市场部计划推出一个新产品或者是一个客户活动,会希望了解哪一种渠道是某类客户最常用的?当想到这个问题的时候,发现航空公司的客户触点太多了。  PSDP行程订单,投诉、行李系统,常旅客系统,手.

  • RapidXML问题

    RapidXML问题XML在编程中会经常应用RapidXML就是用C++实现的一种XML工具它是开源、灵活且高效的仅仅由4个头文件组成,可以直接编译到项目当中。rapidxml.hpprapidxml_utils.hpprapidxml_print.hpprapidxml_iterators.hpp在Linux或者Qt等环境想使用rapidxml_print.hpp中的类会有声明的问题,所以可以在文件的104行处插入如下代码template<classOutIt,classCh>inli

  • Java开发手册之服务器

    Java开发手册之服务器Java开发手册之服务器

发表回复

您的电子邮箱地址不会被公开。

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