钩子编程(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 能使用。
修正:2018-6-18 18:53:58
感谢楼下指正,75行应改动为g_hMouse = SetWindowsHookEx(...)
关于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日
钩子编程(HOOK) 屏蔽全部按键、鼠标及系统功能键 (4)的更多相关文章
- [Windows Hook] 屏蔽键盘按键
//该例程为在系统级屏蔽一些系统键.如WIN.TAB.CAP.POWER.SLEEP.HOME等! //屏蔽组合键下面例程不适用!(比如CTRL+ESC需要在钩子函数中用(p.vkCode = VK_ ...
- 钩子编程(HOOK) 安装进程内键盘钩子 (1)
摘要:钩子能够监视系统或进程中的各种事件消息.截获发往目标窗体的消息并进行处理.这样,我们就能够在系统中安装自己定义的钩子,监视系统中特定事件的发生.完毕特定的功能,比方截获键盘.鼠标的输入.屏幕取词 ...
- js屏蔽键盘按键
3.1屏蔽键盘所有键 <script language="javascript"> <!-- function document.onkeydown(){ eve ...
- MFC屏蔽 WindowS按键
LRESULT CALLBACK LowLevelKeyboardPorc(int nCode,WPARAM wParam,LPARAM lParam)//屏蔽按键的真正实现方法{ BOOL fEat ...
- Python笔记_第四篇_高阶编程_GUI编程之Tkinter_5.鼠标事件
1. 鼠标点击事件: 图示: 实例: import tkinter from tkinter import ttk # 创建主窗口__编程头部 win = tkinter.Tk() # 设置标题 wi ...
- 【转】VC++消息钩子编程
VC++消息钩子编程
- Android4.3 屏蔽HOME按键返回桌面详解(源码环境下)
点击打开链接 首先声明我是做系统开发的(高通平台),所以下面介绍的方法并不适合应用开发者. 最经有个需求要屏蔽HOME按键返回桌面并且实现自己的功能,发现以前的方式报错用不了,上网搜索了一下,发现都是 ...
- vue-router 路由钩子(hook)
钩子(hook)—劫持机制 路由钩子(守卫钩子): 1.全局钩子2.某个路由独享的钩子3.组件内钩子 三种路由钩子中都涉及到了三个参数,官方(https://router.vuejs.org/zh-c ...
- iPhone屏蔽IOS更新、iPhone系统更新的提示(免越狱,有效期更新至2021年)
iPhone屏蔽IOS更新.iPhone系统更新的提示(免越狱,有效期更新至2021年) 1.在Safari浏览器中粘贴如下链接,按提示打开链接. 输入http://apt.dataage.pub 2 ...
随机推荐
- 第七章 资源在Windows编程中的应用 P157 7-8
资源在基于SDK的程序设计中的应用实验 一.实验目的 1.掌握各种资源的应用及资源应用的程序设计方法. 二.实验内容及步骤 实验任务 1.熟悉菜单资源的创建过程: 2.熟悉位图资源的创建: 3.熟 ...
- Luogu 4433 [COCI2009-2010#1] ALADIN
LOJ 2958 线段树 + 类欧 主要矛盾就是$\sum\limits_{i = l}^{r}Ai \mod B$怎么做. 拆成前缀和相减的形式,有 $$\sum_{i = 0}^{r}(Ai \m ...
- [Selenium] 针对下拉菜单出现之后又立马消失的问题,通过Javascript改变元素的可见属性
public void clickDateDropDownButton() { SeleniumUtil.jsClick(driver, page.getDateDropdownButtonOfInv ...
- 饮品类App原型制作分享-WineRatingsPlus
WineRatingsPlus是一款关于红酒的App应用.它帮助你在用餐.聚会或任何场合选择葡萄酒时,都能方便的得到专家意见.同时,它也能帮助鉴赏家和感兴趣的人对葡萄酒更多的了解和选择. 在这款Moc ...
- 玩转Sketch,不容错过的5大实用插件推荐
在之前的文章中,笔者为大家介绍了Sketch 的入门教程.实用技巧和资源集锦,相信大家对Sketch已经有了初步的了解和认识.除了基础的矢量设计功能以外,插件更是让Sketch保持强大的独门秘籍.Sk ...
- SNMP++ 编译记录
/************************************************************** 技术博客 http://www.cnblogs.com/itdef/ ...
- CSS 如何让Table的里面TD全有边框 而Table的右左边框没有
比如这样一个CSS.td3{font-size: 14px;color: #FFFFFF;background-color: #000000;BORDER-RIGHT: #f6f6f6 1px sol ...
- ASP.NET 4(和ASP.NET MVC 2)中输出HTML编码的新语法<%:%>
今天的文章介绍了ASP.NET 4中引入的一个小而且非常有用的新语法功能 - 这是在代码块中自动对输出进行HTML编码的功能.这有助于保护您的应用程序和站点免受跨站点脚本注入(XSS)和HTML注入攻 ...
- IntelliJ IDEA 2017版 快捷键CTRL + SHIFT + A无效如何调试(详细的开启idea自动make功能 )
1.前景描述 因为我把编译器的快捷键都设置成eclipse模式了,所以要做热部署的时候,需要CTRL + SHIFT + A --> 查找Registry --> 找到并勾选compile ...
- 二)quartz.properties
The Properties File Quartz uses a properties file called (kudos on the originality) quartz.propertie ...