C++钩子程序浅析
在网上搜索“键盘记录C++”实现可以找到很多相关文章,我也是照着上面的介绍去研究去试着做的,从懂到不懂。那么为什么有那么多材料我还要去写这样一篇 文章,我想这个是我个人需要关心的问题,我不是那种ctrl+c ctrl+v的复制党,我只想将我所学的东西做个记录。我想每个人对知识的理解是站在不同角度的,希望我的文章可以给读者一些新的理解。
实现钩子的主要API函数:SetWindowsHookEx()。对于没有过研究的人(0基础),建议去百度搜索下这个函数,里面讲解的很详细了。其实 有很多时候一些常用的函数在百度百科里都可以搜到的,讲解的很详细很好了。那么针对这个函数,我还是先照顾那些不爱去动手搜索的人,说说它的几个参数。
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
)
int idHook :int型的参数,一般我们在传递参数时用定义好的宏进行传递,该参数表示安装钩子的类型,比如要安装一个鼠标的钩子那么参数可以写WH_MOUSE或者WH_MOUSE_LL,他们的区别是前者是当调用GetMessage 或者 PeekMessage 函数所触发的鼠标消息,后者是当有鼠标消息事件产生即触发。同理WH_KEYBOARD与WH_KEYBOARD_LL。还有其他类型的钩子,那么可以根 据你的程序需要去定制了。
HOOKPROC lpfn :传递一个处理过程(子程),也就是说当触发了你的钩子,该处理过程负责对产生的消息处理。也就是说,当你安装了键盘钩子去监视键盘消息,当产生了消息就需要调用这个处理过程了。这个过程是自己写的,但它有预先定义好的形式,在下面会讲到。
HINSTANCE hMod :应用程序实例句柄,传递的是所调用的子程的指针地址。如果子程是在程序内部定义的那么该参数必须为NULL。
DWORD dwThreadId:线程标识符,该参数表示与子程相关联的线程ID。通常情况下该参数写0时为全局钩子。
钩子子程:不同类型的钩子对应不同的处理子程,子程也是一个函数,函数内部由程序员自己设计对消息的处理。看下定义:
LRESULT CALLBACK HookProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
int nCode :nCode参数是Hook代码,Hook子程使用这个参数来确定任务。该参数取不同的值代表不同类型的钩子以调用不同的子程。你可以暂时忽略这个参数,照写就行。
WPARAM wParam 、LPARAM lParam :分别是传给钩子子程的wParam值,其具体含义与钩子类型有关。可以说这两个参数包含了我们所要处理的鼠标、键盘、以及其他类型钩子的信息。
当钩子子程的返回值为1时表示该子程已经对消息进行过了处理,将不再向下传递。在鼠标、键盘钩子中的效果就是屏蔽了所有的鼠标点击和键盘按下消息,对于该类型的输入操作程序将不予响应。
下面帖上个程序代码:
#define _WIN32_WINNT 0x0500
#include
using namespace std;
HHOOK g_hMouse ;//鼠标钩子全局变量
HHOOK g_hKeyb ;//键盘钩子全局变量
LRESULT CALLBACK MouseProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
//添加任意自定义代码,对wParam、lParam消息进行处理。
//将消息向下一个钩子传递
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
LRESULT CALLBACK KeybdProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
//添加任意自定义代码,对wParam、lParam消息进行处理。
//将消息向下一个钩子传递
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
void SetHook() {
//钩子的安装
g_hMouse = SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("HookDll"),0);
g_hKeyb = SetWindowsHookEx(WH_KEYBOARD_LL,KeybdProc,GetModuleHandle("HookDll"),0);
//GetModuleHandle函数用来获取调用子程DLL的指针地址。
}
void UnHook(){
//卸载鼠标、键盘钩子
UnHookWindowsHookEx(g_hMouse);
UnHookWindowsHookEx(g_hKeyb);
}
如上代码是写在一个简单的钩子DLL中的框架,当然它是不能运行的了,可以用来参考学习。
里面有两个函数是上面没说过的:
CallNextHookEx():将消息向下一个钩子传递。
UnHookWindowsHookEx():卸载钩子。
下面给出我写的一个简单实例:
- LRESULT CALLBACK CMessMangerApp::GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
- {
- AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
- LPMSG lpMsg = (LPMSG) lParam;
- if(AfxGetApp()->PreTranslateMessage(lpMsg))
- {
- lpMsg->message = WM_NULL;
- lpMsg->lParam = 0L;
- lpMsg->wParam = 0;
- }
- // Passes the hook information to the next hook procedure in
- // the current hook chain.
- return ::CallNextHookEx(hHook, nCode, wParam, lParam);
- }
- BOOL CMessMangerApp::InitInstance()
- {
- hHook = ::SetWindowsHookEx(
- WH_GETMESSAGE,
- GetMessageProc,
- AfxGetInstanceHandle(),
- GetCurrentThreadId());
- ASSERT (hHook);
- return CWinApp::InitInstance();
- }
- int CMyApp::ExitInstance()
- {
- UnhookWindowsHookEx((HHOOK)hHook);
- return CWinApp::ExitInstance();
- }
C++钩子程序浅析的更多相关文章
- 利用 java.lang.Runtime.addShutdownHook() 钩子程序,保证java程序安全退出
以前在开发时只知道依靠数据库事务来保证程序关闭时数据的完整性. 但有些时候一个业务上要求的原子操作,不一定只包括数据库,比如外部接口或者消息队列.此时数据库事务就无能为力了. 这时我们可以依靠java ...
- jenkins 整合maven,svn(配置钩子程序实现提交代码自动构建),tomcat实现热部署(windows+linux分别实现)
springboot : https://blog.csdn.net/zjh_746140129/article/details/80904876 1 准备工作: (1)运行jenkins的tomca ...
- java线程基础巩固---如何给你的应用程序注入钩子程序
这次做一个比较有意思的实验,我们知道当一个程序如果抛异常了其程序肯定会挂掉,那有木有可能在程序异常退出时能执行一段咱们自己的代码,比如说服务器在异常退出时需要做一些额外的资源清理,像这种场景就正好是这 ...
- 用简单的 Node.js 后台程序浅析 HTTP 请求与响应
用简单的 Node.js 后台程序浅析 HTTP 请求与响应 本文写于 2020 年 1 月 18 日 我们来看两种方式发送 HTTP 请求,一种呢,是命令行的 curl 命令:一种呢是直接在浏览器的 ...
- vb小程序浅析
系统 : Windows xp 程序 : BJCM10B 程序下载地址 :http://pan.baidu.com/s/1dFyXe29 要求 : 编写注册机 使用工具 : OD 可在看雪论坛中查找关 ...
- 通过钩子程序跨程序关闭Window
需求: 在实际场景中会有自身程序在调用第三方的动态库过程中,因为第三方的动态库弹框导致线程阻塞,必须手动将弹窗关闭后才能回到自身程序的主线程中. 最简单的场景就是很多自助设备,本身是没有固定操作员的, ...
- c# 钩子程序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- windows消息钩子注册底层机制浅析
标 题: [原创]消息钩子注册浅析 作 者: RootSuLe 时 间: 2011-06-18,23:10:34 链 接: http://bbs.pediy.com/showthread.php?t= ...
- 利用钩子函数来捕捉键盘响应的windows应用程序
一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到 ...
随机推荐
- ansible 文件和目录操作
ansible file 模块参考: refer to https://docs.ansible.com/ansible/latest/modules/file_module.html?highlig ...
- YACEP相关技术工具服务技巧(上)
这篇随笔的核心是介绍一下YACEP所用到的一些技术,工具,服务和技巧,鉴于篇幅原因,不可能面面俱到,只能点到为止,目录如下: 目录: 1. YACEP简介(上) 2. 技术篇( ...
- dhlin-vim-wiki
记录vim中常用的几个操作 入门指南 $ vimtutor vim中是区分大小写 vim中移动光标 h 向左移动 j 向下移动 k 向上移动 l 向右移动 其实使用方向键也是能移动的,但是熟悉后再一些 ...
- 【JSOI2007】文本生成器
用AC自动机处理所有了解的单词 显然,不能直接算,直接算的话,我们需要大力容斥,复杂度不允许 我们不妨反过来做,我们根据AC自动机处理出所有的不可行解,然后用总数减去即可 计算所有不可行解用dp,\( ...
- 寒假week1---二分查找(二分枚举)
寒假week1---二分查找(二分枚举)1.适用条件:要查找(枚举)的集合有序 && 查找(枚举)的“条件”具有单调性2.什么是“条件”:example: 1.给定一个有序数组,从中查 ...
- OnChencedChang
(一) 1,布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...
- Jenkins插件HTML Publisher Plugin的使用
前提: 下载插件HTML Publisher plugin 一.安装 安装好HTML Publisher plugin之后,会在新建或者编辑项目时,在[增加构建后操作步骤]出现[Publish HTM ...
- MySQL OCP
http://www.royalwzy.com/ http://www.aixchina.net/home/space.php?uid=898169
- [Js]删除数组指定元素
写在前面 在最近的项目中,有用到js对数组的操作,之前自己几乎没有用到这种方法,这里就记录一下,算是对学到的东西的一种总结吧. 数组对象splice方法 splice() 方法向/从数组中添加/删除项 ...
- DB11 TCP数据协议拆包接收主要方法
北京地标(DB11) 据接收器. /// <summary> /// DB11协议拆包器 /// </summary> public class SplictProtocol ...