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)


相关推荐

  • mapState与mapGetters语法糖

    mapState与mapGetters语法糖vuex中的mapState,mapGetters属于辅助函数,其实就是vuex的一个语法糖,使代码更简洁更优雅。<script>import{mapState,mapGetters}from”vuex”exportdefault{computed:{ //原先templateInfo(){ returnthis.$store.state.templateInfo},//现在

  • C#生成透明背景图片的方法「建议收藏」

    C#生成透明背景图片的方法「建议收藏」///<summary>///ReturnsatransparentbackgroundGIFimagefromthespecifiedBitmap.///</summary>///<paramname=”bitmap”>TheBitmaptomaketransparent.&l…

  • 解决“The method XXXXXX of type XXXXXXXXX must override a superclass method”

    解决“The method XXXXXX of type XXXXXXXXX must override a superclass method”我的Eclipse版本是3.6.1 @Override时出现以下错误:  ThemethodXXXXXX oftypeXXXXXXXXXmust overrideasuperclassmethod  上网搜索原来原因是:实现类里面使用了@Override,那么在JDK1.5下要使用@Override

  • mybatiscodehelperpro激活码【2021.10最新】

    (mybatiscodehelperpro激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • file_get_contents 返回null,allow_url_fopen = On如何解决

    file_get_contents 返回null,allow_url_fopen = On如何解决绝对有效开启fsockopen函数iis6打开allow_url_fopen设置发表时间:2013-12-0611:48来源:未知分类:其它代码作者:岑溪网站开发点击:75次烦爆了,今天装个自己租了个有了务器,想装discuz两个函数allow_url_fopen和file_get_contents都不能成功开启。为什么不能成功开启,按照网上说的allow_

  • 反相加法器与同相加法器对比分析「建议收藏」

    反相加法器与同相加法器对比分析「建议收藏」最近对比复习了模电里面同相加法器与反相加法器电路。分析了他们之间的差别,并将分析过程记录在下,欢迎大家交流讨论。1、反相加法器R为平衡电阻,R=R1//R2//Rf。根据运算放大器的虚短虚断特性

发表回复

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

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