引言:我的世界是一款风靡全球的游戏,其中键盘操作很多,比如W,A,S,D,E,Q等,往往在遇到突发险情时举手无措(对与我这种新手玩家),既然都是键盘操作,我们用C++实现一个伪作弊(不是违规违法的那种)
正文:首先我们要介绍几个函数
1:GetAsyncKeyState,看一下网上对其的解释
GetAsyncKeyState是一个用来判断函数调用时指定虚拟键的状态,确定用户当前是否按下了键盘上的一个键的函数。如果按下,则返回值最高位为1。//引用来自百度百科,以下同
很难懂吧,直接看用法
#define T_keydown(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
这是一个宏函数,用来判断某键是否按下(T_是我为了避免重复写的前缀,没什么意思)
2:keybd_event,用来模拟按键
keybd_event 是函数功能:该函数合成一次击键事件。系统可使用这种合成的击键事件来产生WM_KEYUP或WM_KEYDOWN消息。
直接看用法
keybd_event(VK_SPACE/*键盘码,这里是空格*/,0,0,0);
keybd_event(VK_SPACE/*键盘码,这里是空格*/,0,KEYEVENTF_KEYUP,0);
3:mouse_event,模拟键盘
mouse_event是一个计算机函数,功能是综合鼠标移动和按钮点击。如果鼠标被移动,用设置MOUSEEVENTF_MOVE来表明,dX和dy保留移动的信息。给出的信息是绝对或相对整数值。
mouse_event(MOUSEEVENTF_RIGHTDOWN|MOUSEEVENTF_RIGHTUP,0,0,0,0);//右键一次
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//按下右键
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//抬起右键
正式开工
跑步
不知道有没有这样的感觉,很难腾出手一直按着Ctrl键(特别是我的键盘位置刁钻),过一段时间按一下又麻烦,我就想到,可以用C++帮我按住按键。
第一步:判断机制,我们希望按一次键(这里假定为N)开始跑步,再按一次结束,但在短时间内我们会检测到多次按下(其实是没有放开),控制台大概是这样:
开始跑步
结束跑步
开始跑步
结束跑步
……几百次后
结束跑步
必须像蜻蜓点水一般,十分麻烦。😡😵
怎么解决,相信聪明的你已经想到,松开一次才计数,于是有了下面的代码
#include <iostream>
#include <conio.h>
#include <string>
#include <map>
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <math.h>
#include <algorithm>
#define T_keydown(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
int main(int argc, char** argv)
{
int k=0,k1=0;
while(1)
{
if(T_keydown('N')
k=1;
else
if(k==1)
{
k=0;
if(k1);cout<<"结束奔跑"<<endl;
else cout<<"开始奔跑"<<endl;
k1=1-k1;
}
Sleep(10);
}
}
😃
判断有了,我们开始键盘操作,即为开始时按下Ctrl,结束时松开Ctrl,简单易改
#include <iostream>
#include <conio.h>
#include <string>
#include <map>
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <math.h>
#include <algorithm>
#define T_keydown(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
int main(int argc, char** argv)
{
int k=0,k1=0;
while(1)
{
if(T_keydown('N')
k=1;
else
if(k==1)
{
if(k1)
{
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
cout<<"结束奔跑"<<endl;
}
else
{
keybd_event(VK_CONTROL,0,0,0);
cout<<"开始奔跑"<<endl;
}
k1=1-k1
}
Sleep(10);
}
}
结果会发现,不能跳跃了,堪比潜行
换个电脑砸
当然也好解决,只要判断按下空格键,就松开Ctrl键和空格键,再按下就行了
#include <iostream>
#include <conio.h>
#include <string>
#include <map>
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <math.h>
#include <algorithm>
#define T_keydown(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
int main(int argc, char** argv)
{
int k=0,k1=0;
while(1)
{
if(T_keydown('N')
k=1;
else
{
if(k==1)
{
if(k1)
{
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
cout<<"结束奔跑"<<endl;
}
else
{
keybd_event(VK_CONTROL,0,0,0);
cout<<"开始奔跑"<<endl;
}
k1=1-k1
}
if(k1==1)
{
if(T_keydown(VK_SPACE))
{
keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_SPACE,0,0,0);//这里交给键盘松开
keybd_event(VK_CONTROL,0,0,0);
}
}
}
Sleep(10);
}
}
完美解决,还出现了一个意想不到的功能,长按空格到合适时机就可以自动一直跳跃,慎用,总归不希望和小白对战时一蹦一跳的准确接箭,掉下山崖吧(可以确定,复活后还会跳)
最后,我们给他来个黑字白底,加一个缓冲
#include <iostream>
#include <conio.h>
#include <string>
#include <map>
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <math.h>
#include <algorithm>
#define T_keydown(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
int main(int argc, char** argv)
{
SetWindowText(GetConsoleWindow(),"RUN");
system("color F0");
string a;
cout<<"奔跑要按住Ctrl键到手酸?还不能跳跃!自动帮你跑步"<<endl
<<"使用方法:按N键,再次按下结束"<<endl
<<"将在得到指示后开始"<<endl
<<"你可以键入任意词语:";
cin>>a;
cout<<"\""<<a<<"\",HaHa,Let's run"<<endl;
int k=0,k1=0;
while(1)
{
if(T_keydown('N')
k=1;
else
{
if(k==1)
{
if(k1)
{
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
cout<<"结束奔跑"<<endl;
}
else
{
keybd_event(VK_CONTROL,0,0,0);
cout<<"开始奔跑"<<endl;
}
k1=1-k1
}
if(k1==1)
{
if(T_keydown(VK_SPACE))
{
keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_SPACE,0,0,0);//这里交给键盘松开
keybd_event(VK_CONTROL,0,0,0);
}
}
}
Sleep(10);
}
}
收工
或问:就这……?我按Ctrl很舒服,打小白很顺手
这只是最没用的,之一
关注,点赞(这个随你)
接下来我将写:落地水、搭建工具(1,2)、斗争工具、总概(工具)
下一章:落地水,将介绍char,int互换与T_keydown进阶,利用求余放缓和定时器的制作
代码都好了,想直接要工具的
不是图片,下载下来后保存为run.exe即可