控制台编程的常用函数与小功能点实现

控制台编程的常用函数与小功能点实现

接收用户的输入

方法一:

1
2
3
4
#define KEY_DOWN(key) GetAsyncKeyState(key)==(SHORT)0x8001?1:0
//使用方法
if (KEY_DOWN('w')) {}//检测用户是否按下了w键
else if (KEY_DOWN('w')) {}//检测用户是否按下了s键

方法二:

1
2
3
4
5
int waitKey() {
if (_kbhit()) //判断此时用户是否有按键
return _getch();//接收用户按键,并将按键码返回
return 0;
}

在控制台指定位置打印字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/****************************************
* 函数功能:在屏幕的制定行row,制定列col处用颜色color,打印字符串pStr
* 参数列表:
* int x:屏幕的x轴坐标
* int y:屏幕的y轴坐标
* const char* pStd:想要打印的字符串
* WORD color:想要使用的颜色和color命令所用之颜色一致
****************************************/
void WriteChar(short x, short y, const char* pStr, WORD color = 1 | 8) {
COORD pos = { x * 2,y };//保存光标位置
HANDLE hOutStd = GetStdHandle(STD_OUTPUT_HANDLE);//获取句柄
//设置当前光标位置
SetConsoleCursorPosition(hOutStd, pos);
//设置输出文本的颜色
SetConsoleTextAttribute(hOutStd, color);
printf("%s", pStr);//在制定位置打印字符串
}

设置控制台的高度和宽度

设置命令行参数 列宽:conls 行宽:lines

1
2
system("title XXXX");	//设置控制台的标题
system("mode con cols=120 lines=50"); //设置控制台的宽度和高度

启动时中文输入法问题

打开控制台时,先判断是否为中文输入法,若成立则捕获输入法,再通过模拟按键SHIFT来修改输入法状态

1
2
3
keybd_event(VK_SHIFT, 0, 0, 0);
Sleep(100);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);

封装一个能在控制台任意行列写自字符串的函数,设置控制台光标闪烁问题,隐藏控制台光标,需要时恢复可见

1
2
3
4
5
6
7
void ShowCursor(bool isShow) {
HANDLE hOutStd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;//控制台光标信息结构类型
cci.dwSize = 1; //光标大小
cci.bVisible = isShow; //是否显示光标(true为显示,false为不显示)
SetConsoleCursorInfo(hOutStd, &cci);//设置控制台屏幕光标大小和可见性
}

播放背景音乐

注意sound文件夹在自己创建的项目的当前目录下,且音乐文件只能为wav格式

1
2
3
#include<Windows.h>
#pragma commit(lib,"winmm.lib")
PlaySoundA("sound\\开始.wav", NULL, SND_ASYNC | SND_NODEFAULT);

使用控制台API接收键盘输入

使用控制台API接收键盘输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// ※ 注 ※  :如果想在控制台启用鼠标事件,请右键单击控制台选择属性,在选项中禁用快速编辑模式即可
void OutputPos(int nX, int nY);//输出调试坐标信息
void KeyEventProc(KEY_EVENT_RECORD ker);//键盘事件处理函数
void MouseEventProc(MOUSE_EVENT_RECORD mer);//鼠标事件处理函数
int MessageLoop();//消息处理函数
int _tmain(int argc, _TCHAR* argv[]) {
MessageLoop();//消息处理
getchar();
return 0;
}
//输出调试坐标信息
void OutputPos(int nX, int nY) {
char szBuf[100] = { 0 };
sprintf_s(szBuf, sizeof(szBuf), " x=%2d , y=%2d ", nX / 2, nY);
SetConsoleTitleA(szBuf);
WriteChar(0, 0, szBuf, 0x50);
}
//键盘事件处理函数
void KeyEventProc(KEY_EVENT_RECORD ker) {
if (ker.bKeyDown)
WriteChar(0, 0, "键盘按下", 0x50);
else
WriteChar(0, 0, "键盘弹起", 0x50);
}
//鼠标事件处理函数
void MouseEventProc(MOUSE_EVENT_RECORD mer) {
switch (mer.dwEventFlags)
{
case 0:
if (mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) {
WriteChar(0, 0, "左键单击", 0x50);
}
else if (mer.dwButtonState == RIGHTMOST_BUTTON_PRESSED) {
WriteChar(0, 0, "右键单击", 0x50);
}
break;
case DOUBLE_CLICK:
WriteChar(0, 0, "双击", 0x50);
break;
case MOUSE_MOVED:
OutputPos(mer.dwMousePosition.X, mer.dwMousePosition.Y);
break;
}
}
//消息处理函数
int MessageLoop() {
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD stcRecord = { 0 };
DWORD dwRead;
SetConsoleMode(hStdin, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);

while (1) {
//等待事件
ReadConsoleInput(hStdin, &stcRecord, 1, &dwRead);
//处理事件
if (stcRecord.EventType == KEY_EVENT) {
//键盘事件
KeyEventProc(stcRecord.Event.KeyEvent);
}
else if (stcRecord.EventType == MOUSE_EVENT) {
MouseEventProc(stcRecord.Event.MouseEvent);
}
}
}