欢迎来到 s a y − f a l l 的文章 欢迎来到say-fall的文章 欢迎来到say−fall的文章

🌈这里是say-fall分享,感兴趣欢迎三连与评论区留言 🔥专栏: 《C语言从零开始到精通》 《C语言编程实战》 《数据结构与算法》 《小游戏与项目》 💪格言:做好你自己,你才能吸引更多人,并与他们共赢,这才是你最好的成长方式。
前言:
本篇博客带大家介绍一下winAPI函数,为接下来给大家带来的贪吃蛇小游戏做铺垫
文章目录
- 前言:
- 正文:
-
- winAPI介绍
- 控制台程序
-
- [1. 什么是控制台程序](#1. 什么是控制台程序)
- [2. mode和title 命令](#2. mode和title 命令)
- [3. GetStdHandle() 函数](#3. GetStdHandle() 函数)
- [4. GetConsoleCursorInfo() 函数](#4. GetConsoleCursorInfo() 函数)
- [5. CONSOLE_CURSOR_INFO 结构体](#5. CONSOLE_CURSOR_INFO 结构体)
- [6. SetConsoleCursorInfo () 函数](#6. SetConsoleCursorInfo () 函数)
- [7. 控制台屏幕上的坐标COORD](#7. 控制台屏幕上的坐标COORD)
- [8. SetConsoleCursorPosition() 函数](#8. SetConsoleCursorPosition() 函数)
- [9. GetAsyncKeyState() 函数](#9. GetAsyncKeyState() 函数)
正文:
winAPI介绍
在 Windows 操作系统的生态中,WinAPI(Windows Application Programming Interface,Windows 应用程序编程接口)是连接上层应用与系统内核的核心桥梁。它并非单一的函数或工具,而是微软为开发者提供的一套庞大、标准化的底层接口集合,涵盖窗口管理、文件操作、进程控制、图形渲染、网络通信等所有 Windows 系统级功能的调用入口。
对于普通用户而言,WinAPI 是 "隐形" 的 ------ 我们日常使用的浏览器、办公软件、桌面工具,其窗口显示、鼠标交互、文件保存等核心功能,本质上都是通过调用 WinAPI 与操作系统底层进行通信实现的。而对于开发者来说,WinAPI 是解锁 Windows 原生能力的 "钥匙":它跳过了高级框架的封装,直接让程序与系统内核、硬件资源交互,既能实现更精细的功能控制,也能打造高性能、轻量化的原生应用。
不同于 Python、Java 等语言的跨平台框架,WinAPI 是 Windows 专属的底层接口,主要基于 C/C++ 语言设计(也可通过其他语言间接调用),其设计思路深深契合 Windows 的消息驱动机制。无论是开发简单的桌面窗口程序,还是复杂的系统工具、硬件交互软件,理解 WinAPI 的核心逻辑,都是掌握 Windows 系统编程的基础。
本篇文章我们主要了解一下winAPI关于控制台程序的函数
控制台程序
1. 什么是控制台程序
- 控制台程序是仅通过文本界面(控制台 / 命令行窗口) 与用户交互的计算机程序,没有图形化界面(如按钮、窗口、菜单),完全依赖命令输入、文本输出完成操作。
我们平时使用的 黑框框 就是控制台程序
举例说明
- 你日常使用的 cmd 命令行(如 dir 查看文件、ping 测试网络),本质是 Windows 系统自带的控制台程序。
- 用 C 语言写的 printf("Hello World") 程序,运行后弹出的黑色窗口就是控制台,仅显示文本内容。
- Python 脚本中通过 input() 接收用户输入、print() 输出结果的程序,也属于控制台程序。
2. mode和title 命令
在此之前我们先了解一下C语言中的window库:
-
<windows.h>是 Windows 系统下 C/C++ 编程的核心头文件,它是访问 WinAPI(Windows 应用程序编程接口)的总入口,包含了 Windows 系统编程所需的绝大多数声明、宏定义和数据结构。system()函数
-
函数原型:
c
int system(const char *command);
- 头文件:<stdlib.h>(Windows 下包含<windows.h>也会间接包含)
- 功能:将字符串command作为系统命令执行,调用操作系统的命令解释器(Windows 下为cmd.exe)
我们可以使用cmd指令来调整这个控制台窗口的大小和名称
c
mode con cols=100 lines=30
title 我是控制台
演示如下:
c
#include<stdio.h>
#include<windows.h>
int main()
{
//控制台形式
system("mode con cols=100 lines=30");
system("title 我是控制台");
return 0;
}

有了以上指令,我们就能改变我们执行程序时候控制台的样子
3. GetStdHandle() 函数
- 检索指定标准设备的句柄(标准输入、标准输出或标准错误)。
- 函数原型
c
HANDLE GetStdHandle(DWORD nStdHandle);
- 参数:
nStdHandle指定要获取的标准设备类型,常用值有:
STD_INPUT_HANDLE(DWORD)-10:标准输入设备
STD_OUTPUT_HANDLE(DWORD)-11:标准输出设备
STD_ERROR_HANDLE(DWORD)-12:标准错误设备 - 作用:
通俗来说就是获得一个标准设备:例如说我们要获得屏幕这个标准输出设备
就可以这样写:
c
//获得标准输出设备的句柄
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
好的,我们现在得到了这个句柄,并且把它放到了
HANDLE类型的houtput变量中
4. GetConsoleCursorInfo() 函数
GetConsoleCursorInfo()是 Windows API 中专门用于获取控制台光标属性的函数,它能返回光标的可见性状态和大小比例,是精细控制控制台光标外观的基础。
- 函数原型
c
BOOL GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
- 参数说明:
hConsoleOutput:控制台输出句柄(通过GetStdHandle(STD_OUTPUT_HANDLE)获取)
lpConsoleCursorInfo:指向CONSOLE_CURSOR_INFO结构体的指针,用于接收光标信息
通过这个函数我们得到了现在光标的信息,下面先介绍一下
CONSOLE_CURSOR_INFO结构体
5. CONSOLE_CURSOR_INFO 结构体
- 此结构体内含了光标的信息
c
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize; // 光标大小比例(1-100,1表示细线光标,100表示实心方块)
BOOL bVisible; // 光标可见性(TRUE可见,FALSE隐藏)
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
dwSize:光标填充字符单元格的百分比,默认通常为 25%bVisible:控制光标是否显示在控制台中
而想真正的修改成功一个光标的信息,就需要这个函数来配合:
SetConsoleCursorInfo ()
6. SetConsoleCursorInfo () 函数
- 功能:设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性
- 函数原型
c
BOOL SetConsoleCursorInfo(
HANDLE hConsoleOutput,
const CONSOLE_CURSOR_INFO* lpConsoleCursorInfo
);
可以看到这个函数的变量和上面
GetConsoleCursorInfo()函数是一模一样的,也就是说这两个函数都是在干同一件事情的GetConsoleCursorInfo()函数得到光标信息以后,通过CONSOLE_CURSOR_INFO结构体修改它,而SetConsoleCursorInfo ()就像一个确定键一样,执行它以后,就会设置完成以上修改的信息
c
int main()
{
//获得标准输出设备的句柄
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//创建结构体变量CursorInfo
CONSOLE_CURSOR_INFO CursorInfo;
//获取光标信息
GetConsoleCursorInfo(houtput, &CursorInfo);
//修改光标信息
CursorInfo.dwSize = 100;
//设置光标信息
SetConsoleCursorInfo(houtput, &CursorInfo);
system("pause");
return 0;
}

7. 控制台屏幕上的坐标COORD
COORD是WindowsAPI中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕幕缓冲区上的坐标。
- COORD 结构体定义
c
typedef struct _COORD {
SHORT X; // 横坐标(水平位置)
SHORT Y; // 纵坐标(垂直位置)
} COORD, *PCOORD;
- 用法
c
COORD pos = { 10, 15 };
- 注意:
坐标系(0,0)的原点位于缓冲区的顶部左侧单元格,而且坐标轴是向右和向下是正方向
通过这个结构体,我们就能定义在屏幕上打印输出的位置
8. SetConsoleCursorPosition() 函数
SetConsoleCursorPosition() 是Windows API 中专门用于设置控制台光标位置的函数,通过它可以将光标移动到控制台窗口的任意指定位置,实现精细的文本输出控制。
- 函数原型
c
BOOL SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD dwCursorPosition
);
- 参数说明:
hConsoleOutput:控制台输出句柄(通过GetStdHandle(STD_OUTPUT_HANDLE)获取)
dwCursorPosition:COORD结构体,包含要设置的光标位置坐标(X 为列,Y 为行)
具体用法:
c
int main()
{
//控制台形式
system("mode con cols=100 lines=30");
system("title 我是控制台");
//获得标准输出设备的句柄
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//创建位置pos并修改
COORD pos = { 10, 5 };
//设置光标位置
SetConsoleCursorPosition(houtput, pos);
system("pause");
return 0;
}

我们发现每次调整输出位置很麻烦,于是我们封装一个函数:
c
void Pos(int x,int y)
{
//获得标准输出设备的句柄
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//创建位置pos并修改
COORD pos = { x,y };
//设置光标位置
SetConsoleCursorPosition(houtput, pos);
}
9. GetAsyncKeyState() 函数
GetAsyncKeyState()是 Windows API 中用于检测键盘按键当前状态的函数,它能异步获取指定虚拟键的按下 / 释放状态,是实现实时键盘控制的关键函数。
- 函数原型:
c
SHORT GetAsyncKeyState(int vKey);
-
参数:
vKey指定要检测的虚拟键码(如VK_SPACE空格键、VK_LEFT左箭头键)
具体虚拟按键由微软官方定义了一个表格,可在此网页查看:Virtual-Key 代码
-
返回值:
最高位(位 15) :如果为 1,表示按键当前处于按下状态
最低位(位 0) :如果为 1,表示按键在上次调用后被按下过返回 0 表示按键未被按下
如果我们要判断⼀个键是否被按过,可以检测
GetAsyncKeyState返回值的最低值是否为1,于是我们定义一个宏:
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
这就是本篇文章的全部内容了,感谢阅读
- 本节完...