钩子编程(HOOK) 屏蔽所有按键鼠标及系统功能键

作者 : 卿笃军

上篇文章已经详细的讲解了全局钩子的安装,下面我们增强一下钩子的功能,实现屏蔽所有按键鼠标与系统功能键。

要实现这个功能,我们需要安装两个全局钩子,"鼠标钩子" 与 "低级键盘钩子"。

鼠标钩子:实现屏蔽所有鼠标点击操作。

低级键盘钩子:实现屏蔽所有键盘操作,包括屏蔽功能键(Alt+F4,Win,Alt+Tab, Alt+Esc,Ctrl+Esc....)注意:不包括Ctrl+Alt+Del功能键。

下面开始安装全局钩子。

第一步:打开VC6.0新建一个空dll,首先新建一个dll工程GHookDll,然后在里面新建一个C++源文件GHookDll.cpp(这一步不截图了,不会的请看我的上一篇文章)

第二步:在新建的GHookDll.cpp文件中编写如下代码:

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

HHOOK g_hlowKeyHook = NULL;     //低级键盘钩子句柄
HHOOK g_hMouse = NULL;          //鼠标钩子句柄
HWND g_hWnd = 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:
			{
				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;
	}
	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:钩子代码,钩子进程使用钩子代码去决定是否执行。而钩子代码的值是依靠钩子的种类来定的。每种钩子种类都有他们自己一系列特性的代码。

比如对于WH_KEYBOARD,钩子代码的参数有:HC_ACTION,HC_NOREMOVE。

HC_ACTION的意义:参数wParam 和lParam 包含了键盘敲打消息的信息。

HC_NOREMOVE的意义:参数wParam 和lParam包含了键盘敲打消息的信息,并且,键盘敲打消息一直没有从消息队列中删除。

(应用程序调用PeekMessage函数,并且设置PM_NOREMOVE标志)。

也就是说当nCode等于HC_ACTION时,钩子进程必须处理消息。

而为HC_NOREMOVE时,钩子进程必须传递消息给CallNextHookEx函数,而不能做进一步的处理,而且必须有CallNextHookEx函数的返回值。

  • vkCode
  • 类型:dword 值
  • 一种虚拟键代码。代码必须是 1 到 254 范围中的一个值。
  • scanCode
  • 类型:dword 值
  • 关键硬件扫描代码。
  • Flags
  • 类型:dword 值
  • 扩展键标志、 事件注入标志、 上下文代码和过渡状态标志。此成员被指定的如下所示。应用程序可以使用下列值来测试击键标志。

第三步:在该工程中再新建一个GHookDll.def文件(不会的看我上一篇文章),编写如下内容:

LIBRARY GHookDll
EXPORTS
SetHook  @2

第四步:编译->链接。

(好了,dll编写完毕,这时候你能在工程的Debug目录下面找到生成的GHookDll.dll和GHookDll.lib两个文件)

关闭该工程!!!

编写客户端程序调用dll动态链接库。

第一步:新建一个基于MFC对话框的应用程序,命名为GlobalHook。

第二步:将开始生成的GHookDll.dll和GHookDll.lib两个文件拷贝到 GlobalHook 工程的目录下面。

第三步:在BOOL CGlobalHookDlg::OnInitDialog()函数里面添加如下代码~~ 用于动态加载dll和调用钩子函数。

HINSTANCE hInst;
	hInst = LoadLibrary("GHookDLL.dll");
	typedef void (*SetHookProc)(HWND hWnd);
	SetHookProc SetHook = (SetHookProc)GetProcAddress(hInst,"SetHook");
	SetHook(m_hWnd);

添加位置如下图:

第四步:编译->链接->运行。

这时候你会发现,鼠标,键盘都不能用了,连带功能键也被屏蔽了。

当然,我们这里为了方便我们测试退出,我们设置了一个后门:按F8退出。

参考文献:百度百科,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日

钩子编程(HOOK) 屏蔽所有按键鼠标及系统功能键,布布扣,bubuko.com

时间: 2024-10-12 20:14:24

钩子编程(HOOK) 屏蔽所有按键鼠标及系统功能键的相关文章

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

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

钩子编程(HOOK) 安装进程内鼠标钩子

作者 : 卿笃军 钩子函数: WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一.利用它们,您可以捕捉您自己进程或其它进程发生的事件.通过"钩挂",您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做"钩子函数",当每次发生您感兴趣的事件时,WINDOWS都将调用该函数. 下面介绍如何安装一个进程内的鼠标钩子. 第一步:打开VC6.0,新建一个基于对话框的MFC应用程序. 第二步:将如下代码拷贝到BOOL CInnerHookDlg::OnI

钩子编程(HOOK) 安装进程内键盘钩子

作者 : 卿笃军 系统钩子:钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理.这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘.鼠标的输入,屏幕取词,日志监视等等. 下面演示如何安装进程内键盘钩子: 第一步:打开VC6.0,创建一个基于对话框的MFC应用程序. 第二步:在BOOL CHookDlg::OnInitDialog()函数上面编写如下代码:(注意是在上面编写,不是在OnInitDialog()里面) HHOOK g

钩子编程(HOOK) 安装进程内键盘钩子 (1)

摘要:钩子能够监视系统或进程中的各种事件消息.截获发往目标窗体的消息并进行处理.这样,我们就能够在系统中安装自己定义的钩子,监视系统中特定事件的发生.完毕特定的功能,比方截获键盘.鼠标的输入.屏幕取词,日志监视等等. 以下演示怎样安装进程内键盘钩子, Step 1:打开VC6.0.创建一个基于对话框的MFC应用程序. Step 2:在BOOL CHookDlg::OnInitDialog()函数上面编写例如以下代码:(注意是在上面编写.不是在OnInitDialog()里面) HHOOK g_h

钩子编程(HOOK) 留后门与钩子卸载

作者 : 卿笃军 问题由来:一般编写钩子程序,我们希望程序一方面能屏蔽键盘鼠标消息,但又希望程序能留有一个"后门",例如,按下F2退出程序. 下面示例,钩子后门设计与钩子卸载: 第一步:打开VC6.0创建一个基于对话框的MFC应用程序. 第二步:在BOOL CHookDlg::OnInitDialog()函数上面编写如下代码,注意不是OnInitDialog()里面: HWND g_hWnd = NULL; //窗口句柄 HHOOK g_hKeyboard = NULL; //钩子句柄

钩子编程(HOOK) 安装系统全局钩子

MySQL使用的是插件式存储引擎. 主要包括存储引擎有:MyISAM,Innodb,NDB Cluster,Maria,Falcon,Memory,Archive,Merge,Federated. 其中最为广泛的是MyISAM 和Innodb两种存储引擎,所以接下来对它们做简单介绍. MyISAM 存储引擎简介 MyISAM 存储引擎的表存储在数据库中,每一个表都被存放为三个以表名命名的物理文件. 1.(.frm文件)任何存储引擎都不可缺少的存放表结构定义信息的文件 2.(.MYD文件)存放表数

C语言控制台窗口图形界面编程(八):鼠标事件

<知识分享> 上次讲的是键盘事件,这次我们介绍鼠标事件.下面先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD      //鼠标事件结构体 { COORD dwMousePosition;      //当前鼠标在控制台窗口缓冲区的位置 DWORD dwButtonState;        //鼠标按键的状态 DWORD dwControlKeyState;    //控制键状态 DWORD dwEventFlags;       

MFC屏蔽 WindowS按键

LRESULT CALLBACK LowLevelKeyboardPorc(int nCode,WPARAM wParam,LPARAM lParam)//屏蔽按键的真正实现方法{ BOOL fEatKeystrole = FALSE; if (nCode == HC_ACTION) { switch (wParam) { case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: { PKBDLLHOOKSTRUC

【转】VC++消息钩子编程

VC++消息钩子编程