c语言hook键盘fn键,钩子编程(HOOK) 障蔽所有按键鼠标及系统功能键

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

作者 : 卿笃军

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

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

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

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

下面开始安装全局钩子。

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

150731366.png

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

#define _WIN32_WINNT 0x0500 // PKBDLLHOOKSTRUCT

#include

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);添加位置如下图:

150731367.png

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

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

当然,我们这里为了方便我们测试退出,我们设置了一个后门:按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日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值