`
zyc1006
  • 浏览: 133914 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

VC++ Keyboard Hook

    博客分类:
  • C++
阅读更多

Wince 不支持钩子

VC钩子的学习

http://hi.baidu.com/zxchao/blog/item/93b7650e644417c37acbe132.html

下面这篇转载自 :  http://www.programfan.com/blog/article.asp?id=20338

个人觉得写得很不错,详细。

VC++引用键盘钩子(2006-11-14 22:58:00)

【收藏】 【评论】 【打印】 【关闭】

 

在科研生产中对研制、调试操作的记录是非常有必要而且是有很重要价值的。通过对记录信息的分析,可以在事故发生后准 确的分析出事故的起因、操作是否存在失误等许多重要线索。通常需要记录的信息是多种多样的,如环境温度记录、软件运行记录、文件访问记录等等。这里将以键 盘信息记录为例来讲述类似的实验信息自动记录的一般实现方法。

  由于需要记录当前系统下所有应用程序的键盘录入记录,因此必须采取某种 特殊的技术来实现本进程(监视程序)对外部进程键盘操作信息的获取。这种技术便是本文将要论述的核心--系统全局钩子。本文下面将对Win32平台下全局 钩子的运行机制进行介绍并给出了一个具体的由VC++6.0编写的捕获键盘动作的键盘钩子示例程序。

  系统钩子和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。

  键盘钩子程序示例

   本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyKook和动态连接库LaunchDLL。首先创建一个MFC AppWizard(DLL)工程,并选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)选项,以建立MFC扩展动态连接库LaunchDLL.dll。之后,在相应的头文件中添加宏定义和待导出函数的声明:

#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()
};

  同时在实现文件中添加全局变量Hook和全局函数LauncherHook()、SaveLog():

HHOOK Hook;
LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam);
void SaveLog(char* c);

  最后,完成以上提到的这几个函数的具体编码实现:

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 & 0x80000000)
  {
   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();
}

  当有键弹起的时候就通过此函数将刚弹起的键保存到记录文件中从而实现对键盘进行监控记录的目的。编译完成便可得到运行时所需的键盘钩子的动态连接库和进行静态链接时用到的lib库。

   下面开始编写调用此动态连接库的主程序,并实现最后的集成。另外创建一个单文档应用程序,把所需的动态链接库头文件、lib库复制到工程目录中,将动态 链接库复制到Debug目录下。然后链接DLL库:在"Project","Settings…"的"Link"属性页内, 在"Object/librarymodules:"中填入"LaunchDLL.lib"。再通过"Project","Add To Project","Files…"将LaunchDLL.h添加到工程中来,最后在视类的源文件KeyHook.cpp中加入对其的引用:

#include "LaunchDLL.h"

  这样我们就可以象使用本工程内的 函数一样使用动态连接库LaunchDLL.dll中的所有导出函数了。接下来在视类重载虚函数OnInitialUpdate(),并添加代码完成对键盘钩子的安装:

InstallLaunchEv();

  到此为止其实已经完成了所有的功能,但由于本程序是作为一个后台监控软件运行,因此还应当采取其他措施以隐藏其程序界面 。这只需在应用程序类CkeyHookApp的InitInstance()函数中将m_pMainWnd->ShowWindow(SW_SHOW)改为m_pMainWnd->ShowWindow(SW_HIDE)即可。

  小结


   编译运行程序,运行起来之后并无什么现象,但通过Alt+Ctrl+Del在关闭程序对话框内可以找到我们刚编写完毕的程序"KeyHook",随便在 什么程序中通过键盘输入字符,然后打开记录文件,我们会发现:通过键盘钩子,我们刚才输入的字符都被记录到记录文件中了。系统钩子具有相当强大的功能,通 过这种技术可以对几乎所有的Windows系统消息进行拦截、监视、处理。这种技术广泛应用于各种自动监控系统中。本文所述程序在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0编译调试通过。
为了练习,自己也跟着讲解做了一个钩子的例子,放在本地F:\WORK\MID\Practice\CallHook 和 TestHook文件夹,
分享到:
评论

相关推荐

    VC++的HOOK实例

    在这个"VC++的HOOK实例"中,我们关注的是键盘事件,即WH_KEYBOARD_LL类型的HOOK。 首先,我们需要创建一个静态链接库(DLL)或者使用已有的DLL来存放HOOK处理函数。这个函数通常被声明为HHOOK类型的,并且必须遵循...

    vc_hook.rar_hook_hook vc++_hook键盘记录_vc hook

    本资源“vc_hook.rar_hook_hook_vc++_hook键盘记录_vc hook”显然是一个使用VC++(Visual C++)开发的,涉及到Windows API Hook技术的项目,其主要目标是记录键盘输入。下面我们将详细探讨相关的知识点。 1. **Hook...

    VC++写的HOOK

    在IT行业中,HOOK技术是一种非常重要的编程技巧,尤其在Windows平台上,VC++是常见的开发工具。本项目"VC++写的HOOK"显然涉及到使用C++语言编写程序,利用Windows API提供的钩子机制来拦截和处理系统事件,特别是...

    HOOKDLL_lungsxlb_hookdll钩子_vc++_hook_源码

    标题“HOOKDLL_lungsxlb_hookdll钩子_vc++_hook_源码”指的是一个使用VC++编程语言实现的钩子(Hook)技术示例,主要用于监控和截取键盘输入的Keydown和Keyup事件。在Windows操作系统中,钩子是一种机制,允许应用...

    vc++6.0Hook(钩子)编程视频教程(附源码)

    【VC++6.0 Hook(钩子)编程】 在Windows操作系统中,Hook是一种技术,它允许程序员拦截系统或应用程序中的特定事件,如键盘输入、鼠标点击等,以便在这些事件发生时执行自定义代码。VC++6.0是微软公司推出的一款...

    VC++ HOOK Api使用大全及演示.rar

    本资源"VC++ HOOK Api使用大全及演示"着重介绍了如何在Visual C++环境下利用HOOK API来实现这一功能。 首先,我们需要了解HOOK的基本概念。HOOK在Windows编程中,是一种机制,它允许你插入一段代码(称为HOOK子程序...

    vc++ hook 键盘钩子

    键盘钩子(Keyboard Hook)是一种特殊的钩子类型,允许程序监听和响应键盘事件。当用户按下或释放一个键时,键盘钩子可以捕获这些事件并在它们到达目标应用程序之前执行自定义操作,如记录按键、修改输入等。 ### 2...

    vc++6.0全局Hook(钩子)

    在VC++6.0这个经典的开发环境中,实现全局Hook可以帮助我们监控和控制应用程序的行为。下面将详细阐述全局Hook的基本概念、工作原理以及如何在VC++6.0中实现它。 全局Hook是一种系统级别的机制,它通过安装一个特殊...

    Hook(钩子)的实现

    例如,WH_KEYBOARD_LL类型的Hook可以监听系统的键盘事件。 - **应用程序级Hook**:只对特定的应用程序生效,通常用于同一进程内部或者不同进程之间的通信。 ### 3. Hook的实现原理 Hook的实现通常涉及以下几个步骤...

    非常好的Hook api实例VC++源码

    1. **理解Hook原理**:深入研究Windows API中的Hook机制,包括不同类型的Hook(如WH_KEYBOARD_LL、WH_MOUSE_LL等)以及它们在系统中的作用。 2. **源码结构分析**:查看源码的组织结构,找出如何定义和注册Hook函数...

    VC++监测记录键盘(hook编程)

    标题"VC++监测记录键盘(hook编程)"指出我们将探讨如何使用Visual C++来实现键盘监控,通过设置钩子函数来捕获和处理键盘事件。 首先,我们要理解什么是Hook。在Windows API中,Hook是一种机制,它允许用户在系统或...

    VC HOOK编程大全

    通过学习《VC HOOK编程大全》,开发者不仅可以掌握如何在VC++环境下实现钩子编程,还能了解到各种应用场景和最佳实践,为日常开发工作提供强大的工具支持。结合实际项目,不断实践和总结,才能更好地发挥钩子功能,...

    Hook的简单举例 (VC++深入详解第二十章代码)

    本案例主要探讨的是在VC++环境下的Hook应用,通过深入解析第二十章的代码,我们可以更深入地理解这一技术。 首先,"Hook的简单举例"指的是使用钩子函数(Hook Function)来监控或修改其他程序的行为。在Windows API...

    VC++ hookhookhookhookhookhookhookhook

    本文将深入解析VC++中hook技术的原理及其应用,并提供源代码示例,帮助初学者理解这一复杂的主题。 首先,我们要明白什么是hook。在Windows操作系统中,hook是一种机制,允许开发者注册一个函数(称为"钩子"),这...

    全局键盘钩子 EXE主程序可以接收DLL消息 能识别热键F12 含源码

    在Windows API中,`SetWindowsHookEx`函数用于安装钩子,其中`WH_KEYBOARD_LL`参数表示低级键盘钩子,即全局键盘钩子。一旦设置成功,每当键盘事件发生时,Windows会调用我们在钩子回调函数中指定的代码。回调函数...

    VC 键盘HOOK枚举并隐藏/显示指定窗口.rar

    在VC++编程环境中,开发人员有时需要对键盘事件进行监控或者拦截,这通常涉及到Windows API中的键盘钩子(Keyboard Hook)技术。在这个“VC 键盘HOOK枚举并隐藏/显示指定窗口”的项目中,开发者创建了一个程序,该...

    关于HOOK的简单实例

    本实例将深入探讨基于VC++和MFC的HOOK应用,帮助开发者理解如何利用HOOK来拦截和处理消息。 首先,理解HOOK的基本概念至关重要。在Windows操作系统中,HOOK是一个函数,用于拦截消息或特定事件。当指定类型的事件...

    vc HOOKAPI大全(强烈推荐)

    这个函数需要提供HOOK类型(如WH_KEYBOARD_LL、WH_MOUSE_LL等),回调函数的地址,以及一个模块句柄,确保回调函数在需要时可以被调用。 3. **处理HOOK消息**:在回调函数中,你需要分析`nCode`、`wParam`和`lParam...

    用vc中的hook钩子做的一个屏幕锁定程序

    在Windows环境中,VC++(Microsoft Visual C++)是一种常用的开发环境,可以用来创建各种应用程序,包括使用hook技术来实现屏幕锁定功能。Hook机制是Windows API提供的一种强大功能,允许开发者拦截和处理系统消息,...

    MFC制作基于全局hook的记录键盘工具

    全局钩子通过在系统级别安装WH_KEYBOARD_LL(低级键盘输入钩子)来实现,该钩子会处理所有线程的键盘输入事件。安装全局钩子通常需要一个DLL(动态链接库),因为钩子过程必须在单独的线程中运行,以便在所有进程...

Global site tag (gtag.js) - Google Analytics