钩子编程(HOOK) 屏蔽全部按键、鼠标及系统功能键 (4)

摘要:上篇文章《钩子编程(HOOK) 安装系统全局钩子》已经具体的解说了全局钩子的安装,本文将增强一下钩子的功能,实现屏蔽全部按键鼠标与系统功能键。要实现这个功能,须要安装两个全局钩子,"鼠标钩子" 与 "低级键盘钩子"。鼠标钩子——实现屏蔽全部鼠标点击操作。低级键盘钩子——实现屏蔽全部键盘操作,包含屏蔽功能键(ALT+F4,WIN。ALT+TAB。ALT+ESC,CTRL+ESC....)。注意:不包含CTRL+ALT+DEL功能键。



本文不会具体介绍怎样编写钩子程序。仅仅是对钩子程序DLL核心功能进行阐述。假设你尚不会编写系统全局钩子,那么推荐你阅读《钩子编程(HOOK)初探进程内钩子、全局系统钩子系列文章》。相信你一定会有所收获。


操作系统中,通常会对某些文件进行拷贝副本后执行,为了确保系统全局钩子的更稳定执行,保证仅仅有一份文件的存在——所有共享此文件。在DLL中。有#pragma data_seg()——确保在DLL中定义一个共享的。有名字的数据段。最关键的是:这个数据段中的全局变量能够被多个进程共享。否则多个进程之间无法共享DLL中的全局变量。

要想了解很多其它,能够阅读孙鑫老师的《VC++深入具体解释》一书。该书从实际应用入手,由浅入深、循序渐进地讲述Windows程序内部执行机制、MFC框架、文本、菜单、对话框、文件操作、网络编程、进程间通信、ActiveX控件、动态链接库、HOOK编程等多个主题。

#define _WIN32_WINNT 0x0500   // PKBDLLHOOKSTRUCT
#include <windows.h>

//设置g_hWnd共享,禁止dll拷贝
#pragma data_seg("MyHook")
HWND g_hWnd = NULL;             //窗口句柄
#pragma data_seg()
#pragma comment(linker,"/section:MyHook,RWS")

HHOOK g_hlowKeyHook = NULL;     //低级键盘钩子句柄
HHOOK g_hMouse = NULL;          //鼠标钩子句柄

//低级键盘钩子
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	bool isClick = false;
	PKBDLLHOOKSTRUCT LowKey = NULL;   //该结构体包括底层键盘输入事件的信息
	
	if (nCode == HC_ACTION)      //HC_ACTION  表示有消息
	{
		LowKey = (PKBDLLHOOKSTRUCT)lParam;
		switch (wParam)
		{
        case WM_KEYDOWN:
			{
				isClick = 1;
				if (LowKey->vkCode == VK_F8) // 后门
				{
				//	::MessageBox(NULL,"触发钩子后门程序,正在卸载钩子~~关闭程序","提示",MB_OK);
					SendMessage(g_hWnd, WM_CLOSE, 0, 0);   //发送关闭主窗口消息
					UnhookWindowsHookEx(g_hlowKeyHook);    //卸载低级键盘钩子
					UnhookWindowsHookEx(g_hMouse);         //卸载低级鼠标钩子
				}
				break;
			}
        case WM_SYSKEYDOWN:
        case WM_KEYUP:
        case WM_SYSKEYUP:
			{              // 屏蔽Win
				isClick = (LowKey->vkCode == VK_LWIN) || (LowKey->vkCode == VK_RWIN) ||  
					//屏蔽Alt+F4
					((LowKey->vkCode == VK_F4) && ((LowKey->flags & LLKHF_ALTDOWN) != 0)) ||
					// 屏蔽Alt+Tab
					((LowKey->vkCode == VK_TAB) && ((LowKey->flags & LLKHF_ALTDOWN) != 0)) ||
					// 屏蔽Alt+Esc
					((LowKey->vkCode == VK_ESCAPE) && ((LowKey->flags & LLKHF_ALTDOWN) != 0)) ||
					// 屏蔽Ctrl+Esc
					((LowKey->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0));
				break;
			}
        default:
            break;
		}
	}
	if (isClick)
	{
		return 1;
	}
	return CallNextHookEx(g_hlowKeyHook,nCode,wParam,lParam);  //传给下一个钩子
}

//屏蔽全部鼠标消息
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	return 1;
}

//安装钩子
void SetHook(HWND hWnd)  //为了操作窗口,我们将主窗口的句柄传进去
{
	g_hWnd = hWnd;       //将主窗口句柄传给全局句柄,然后便于在上面的钩子过程中使用
    //安装低级键盘钩子
	g_hlowKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandle("GHookDll"),0);
	//安装鼠标钩子
	g_hlowKeyHook = SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("GHookDll"),0);
}

注意:#define _WIN32_WINNT 0x0500   // PKBDLLHOOKSTRUCT 是为了让PKBDLLHOOKSTRUCT 能使用。


关于nCode相关知识点补充,

nCode:钩子代码,钩子进程使用钩子代码去决定是否运行,而钩子代码的值是依靠钩子的种类来定的。每种钩子种类都有他们自己一系列特性的代码。比方。对于WH_KEYBOARD。钩子代码的參数有:HC_ACTION,HC_NOREMOVE。

HC_ACTION的意义——參数wParam 和lParam 包括了键盘敲打消息的信息。HC_NOREMOVE的意义——參数wParam 和lParam包括了键盘敲打消息的信息,而且,键盘敲打消息一直没有从消息队列中删除。(应用程序调用PeekMessage函数,而且设置PM_NOREMOVE标志)。也就是说当nCode等于HC_ACTION时,钩子进程必须处理消息。而为HC_NOREMOVE时。钩子进程必须传递消息给CallNextHookEx函数。而不能做进一步的处理。而且必须有CallNextHookEx函数的返回值。


References:百度百科,KBDLLHOOKSTRUCT,http://baike.baidu.com/view/6055494.htm ,2014年5月15日

swo2006的博客。屏蔽WIN、ALT+TAB、CTRL+ESC键的低级键盘钩子(ZT)。http://www.cppblog.com/swo2006/articles/11372.html , 2014年5月15日

百度文库,钩​子​函​数​使​用,http://wenku.baidu.com/view/e6fd1cd476a20029bd642d87.html ,2014年5月15日

转载于:https://www.cnblogs.com/jzssuanfa/p/7287285.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值