C++开发——我的世界“作弊“(一)——键盘操作

文章介绍了如何使用C++编程语言,结合GetAsyncKeyState函数检测键盘状态,以及keybd_event函数模拟按键操作,来实现《我的世界》游戏中自动奔跑的功能。通过监听N键来开启和结束奔跑,同时处理空格键的按下,以允许玩家在需要时跳跃。代码示例展示了如何在按下N键时自动按住Ctrl键进行奔跑,再次按下N键时松开Ctrl键结束奔跑,并处理空格键的按下和释放,以保持游戏的正常操作。
摘要由CSDN通过智能技术生成

引言:我的世界是一款风靡全球的游戏,其中键盘操作很多,比如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);//抬起右键

正式开工

  1. 跑步

不知道有没有这样的感觉,很难腾出手一直按着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即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值