1.正文
1.kd
大家好
今天给大家带来:kd(按键按下) 及其类型
先看一个网址:点这里
问题就来了:为什么要用kd???
其实,kd是
#include<windows.h>
的一种函数
原形为:
((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)//没错,后面?1:0是多余的
用define就会简单很多。
例如:
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
而它的用法与虚拟按键有关(至于定义不用去管)
(虚拟按键大全)
常量名 对应按键
————————————————————————
VK_LBUTTON 鼠标左键
VK_RBUTTON 鼠标右键
VK_CANCEL Ctrl+Break
VK_MBUTTON 鼠标中键
VK_BACK Backspace键
VK_TAB Tab 键
VK_RETURN 回车键
VK_SHIFT Shift键
VK_CONTROL Ctrl键
VK_MENU Alt键
VK_PAUSE Pause键
VK_CAPITAL Caps Lock键
VK_ESCAPE Esc键
VK_SPACE 空格键
VK_PRIOR Page Up键
VK_NEXT Page Down键
VK_END End键
VK_HOME Home键
VK_LEFT 左箭头键
VK_UP 上箭头键
VK_RIGHT 右箭头键
VK_DOWN 下箭头键
VK_SNAPSHOT Print Screen键
VK_Insert Insert键
VK_Delete Delete键
'0' – '9' 数字0-9
'A' – 'Z' 字母A - Z
VK_LWIN 左WinKey(104键盘才有)
VK_RWIN 右WinKey(104键盘才有)
VK_APPS AppsKey(104键盘才有)
VK_NUMPAD0 小键盘0键
VK_NUMPAD1 小键盘1键
VK_NUMPAD2 小键盘2键
VK_NUMPAD3 小键盘3键
VK_NUMPAD4 小键盘4键
VK_NUMPAD5 小键盘5键
VK_NUMPAD6 小键盘6键
VK_NUMPAD7 小键盘7键
VK_NUMPAD8 小键盘8键
VK_NUMPAD9 小键盘9键
VK_F1 - VK_F24 功能键F1–F24
VK_NUMLOCK Num Lock键
VK_SCROLL Scroll Lock键
所以,用法应为
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
int main()
{
while(1)
{
//想按下1:
if(kd(VK_NUMPAD1)||kd('1')) cout<<1<<"\n";
//鼠标左键
if(kd(VK_LBUTTON)) cout<<"left\n";
}
return 0;
}
但问题来了:运行后发现,按一次事半功倍,会出现很多个1 / left
所以,就要用一个简单的方法:Sleep() //停顿,照样在windows.h里
改后代码为
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
int main()
{
while(1)
{
//想按下1:
if(kd(VK_NUMPAD1)||kd('1')) cout<<1<<"\n";
//鼠标左键
if(kd(VK_LBUTTON)) cout<<"left\n";
Sleep(50);
}
return 0;
}
那问题来了,讲了这么多,为什么要用kd还是没有讲
那让我们看两段代码的比较
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
int main()
{
while(1)
{
if(kd(VK_NUMPAD1)||kd('1')) cout<<1<<"\n";
if(kd(VK_NUMPAD2)||kd('2')) cout<<2<<"\n";
Sleep(50);
}
return 0;
}
与
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
int main()
{
while(1)
{
char c;
c=getchar();
if(c=='1') cout<<"1\n";
if(c=='2') cout<<"2\n";
Sleep(50);
}
return 0;
}
请大家按住1,时不时按下2
发现什么了吗?????????????????????????
kd可以一时间判断多个键并且没有停顿
getchar一次只能判断一个键而且还有停顿
是不是很影响玩多人游戏???
所以,看ZQK13问的问题:
是不是感觉与kd没什么关系???
举一下例子:
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
void computer_do()
{
//癫脑运动
}
int main()
{
while(1)
{
computer_do();
//玩家运动
if(kd(VK_UP))
{
//玩家向上走
}
if(kd(VK_DOWN))
{
//玩家向下走
}
if(kd(VK_LEFT))
{
//玩家向左走
}
if(kd(VK_RIGHT))
{
//玩家向右走
}
Sleep(50);
}
return 0;
}
妙呀!!!
—————————————————不怎么华丽的分界线—————————————————
2.虚拟按键其他类型
(都在windows.h里面)
1.模拟按下某键
keybd_event(VK_???,0,0,0); //按下??键
2.模拟放开某键
keybd_event(VK_???,0,KEYEVENTF_KEYUP,0); //放开??键
3.按下弹起某键
1&2
4.组合键
n*3
举个栗子
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0) #define down(VK_NONAME) keybd_event(VK_NONAME,0,0,0,0) #define up(VK_NONAME) keybd_event(VK_NONAME,0,0,0,0) #define press(VK_NONAME) up(VK_NONAME),down(VK_NONAME)
像这样,编个坑人小游戏就不是问题了
give a 栗子:
#include<bits/stdc++.h>
#include<windows.h>
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)
using namespace std;
void Init()
{
HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin,&mode);
mode&=~ENABLE_QUICK_EDIT_MODE;
mode&=~ENABLE_INSERT_MODE;
mode&=~ENABLE_MOUSE_INPUT;
SetConsoleMode(hStdin,mode);
CONSOLE_CURSOR_INFO cur={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);
}
void gotoxy(int x,int y)
{
COORD pos={x,y};
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
return;
}
int ti=1,z;
bool mouse;
string aj[5]={"鼠标左键","鼠标右键"},zt[5]={"按NumLock持续"};
int main()
{
Init();
while(1)
{
printf("当前速度:%d次/S,当前按键:%s\n",1000/ti,aj[mouse].c_str());
printf("当前状态:%s\n",zt[z].c_str());
printf("按ESC设置\n");
if(kd(VK_ESCAPE))
{
printf("请输入:\n当前速度:");
scanf("%d",&ti);
if(ti<1) ti=1;
printf("当前按键(0为左键,1为右键):");
scanf("%d",&mouse);
system("cls");
}
gotoxy(0,0);
Sleep(ti);
if((z==0&&kd(VK_NUMLOCK))&&!mouse) mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//这里用mouse_event更方便
if(mouse&&(z==0&&kd(VK_NUMLOCK))) mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//这里用mouse_event更方便
}
return 0;
}
都看到这里了,点个赞呗!!!!
2.后文
参考文章: C/C++ 模拟键盘操作(一)_c++ 键盘按下_折竹丶的博客-CSDN博客
上一篇:c++游戏小技巧3:Sleep(停顿) 与 gotoxy(0,0) (无闪清屏)_L('ω')┘脏脏包└('ω')」的博客-CSDN博客