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);
}

 

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

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

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


相关推荐

  • btav狼php,www.xiaav.cc

    btav狼php,www.xiaav.ccDomainName:XIAAV.CCDomainID:105952573WHOISServer:whois.enom.comReferralURL:http://www.enom.comUpdatedDate:2016-12-21T07:11:52ZCreationDate:2013-05-27T13:45:23ZRegistryExpiryDate:2017-05…

    2022年6月9日
    26
  • 30 个重要数据结构和算法完整介绍建议保存

    30 个重要数据结构和算法完整介绍建议保存数据结构和算法(DSA)通常被认为是一个令人生畏的话题——一种常见的误解。它们是技术领域最具创新性概念的基础,对于工作/实习申请者和有经验的程序员的职业发展都至关重要。话虽如此,我决定在CSDN新星计划挑战期间将我所了解的数据结构和算法集中起来。本文旨在使DSA看起来不像人们认为的那样令人生畏。它包括15个最有用的数据结构和15个最重要的算法,可以帮助您在学习中和面试中取得好成绩并提高您的编程竞争力。后面等我还会继续对这些数据结构和算法进行进一步详细地研究讲解。

    2022年5月23日
    30
  • Java自定义注解Annotation详解[通俗易懂]

    简介开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的作用和自定义注解。列举开发中常见的注解@Override:当重写父类的方法时一般都会在方法上标注上此注解(我们最经常看到的toString()方法上总能看到这货)@Deprecated:用于标记某个方法已经过期,请使用新的方法来替代已经废弃的方法@SuppressWarnings:让编译器或

    2022年4月13日
    63
  • Chapter 5.Interrupt Request Levels(IRQL) and DPCs

    Chapter 5.Interrupt Request Levels(IRQL) and DPCs

    2021年8月9日
    48
  • PostMan使用教程。

    PostMan使用教程。原地址:https://blog.csdn.net/haibo0668/article/details/83828184 Postman教程——发送第一个请求 Postman教程——创建第一个集合 Postman教程——界面功能导航 Postman教程——设置 Pos…

    2022年5月7日
    39
  • matlab中误差计算公式_mse均方误差计算公式

    matlab中误差计算公式_mse均方误差计算公式残差平方和(SSE)计算公式:代码实现:sse=sum((YReal-YPred).^2);均方误差(MSE)计算公式:代码实现:mse=sqrt(sum((YReal-YPred).^2))./2;平均绝对误差(MAE)计算公式:代码实现:mae=mean(abs(YReal-YPred));平均绝对百分比误差(MAPE)计算公式:代码实现mape=mean(abs((YReal-YPred)./YReal));均方根误差(R

    2022年9月30日
    0

发表回复

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

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