
🌈这里是say-fall分享,感兴趣欢迎三连与评论区留言 🔥专栏: 《C语言从零开始到精通》 《C语言编程实战》 《数据结构与算法》 《小游戏与项目》 💪格言:做好你自己,你才能吸引更多人,并与他们共赢,这才是你最好的成长方式。
本篇博客带大家介绍一下winAPI函数,为接下来给大家带来的贪吃蛇小游戏做铺垫
在 Windows 操作系统的生态中,WinAPI(Windows Application Programming Interface,Windows 应用程序编程接口)是连接上层应用与系统内核的核心桥梁。它并非单一的函数或工具,而是微软为开发者提供的一套庞大、标准化的底层接口集合,涵盖窗口管理、文件操作、进程控制、图形渲染、网络通信等所有 Windows 系统级功能的调用入口。
对于普通用户而言,WinAPI 是 “隐形” 的 —— 我们日常使用的浏览器、办公软件、桌面工具,其窗口显示、鼠标交互、文件保存等核心功能,本质上都是通过调用 WinAPI 与操作系统底层进行通信实现的。而对于开发者来说,WinAPI 是解锁 Windows 原生能力的 “钥匙”:它跳过了高级框架的封装,直接让程序与系统内核、硬件资源交互,既能实现更精细的功能控制,也能打造高性能、轻量化的原生应用。
不同于 Python、Java 等语言的跨平台框架,WinAPI 是 Windows 专属的底层接口,主要基于 C/C++ 语言设计(也可通过其他语言间接调用),其设计思路深深契合 Windows 的消息驱动机制。无论是开发简单的桌面窗口程序,还是复杂的系统工具、硬件交互软件,理解 WinAPI 的核心逻辑,都是掌握 Windows 系统编程的基础。
本篇文章我们主要了解一下winAPI关于控制台程序的函数
我们平时使用的 黑框框 就是控制台程序
举例说明
在此之前我们先了解一下C语言中的window库:
<windows.h>是 Windows 系统下 C/C++ 编程的核心头文件,它是访问 WinAPI(Windows 应用程序编程接口)的总入口,包含了 Windows 系统编程所需的绝大多数声明、宏定义和数据结构。
system()函数
int system(const char *command);我们可以使用cmd指令来调整这个控制台窗口的大小和名称
mode con cols=100 lines=30
title 我是控制台演示如下:
#include<stdio.h>
#include<windows.h>
int main()
{
//控制台形式
system("mode con cols=100 lines=30");
system("title 我是控制台");
return 0;
}
有了以上指令,我们就能改变我们执行程序时候控制台的样子
HANDLE GetStdHandle(DWORD nStdHandle);nStdHandle指定要获取的标准设备类型,常用值有:
STD_INPUT_HANDLE (DWORD)-10:标准输入设备
STD_OUTPUT_HANDLE (DWORD)-11:标准输出设备
STD_ERROR_HANDLE (DWORD)-12:标准错误设备//获得标准输出设备的句柄
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);好的,我们现在得到了这个句柄,并且把它放到了
HANDLE类型的houtput变量中
GetConsoleCursorInfo()是 Windows API 中专门用于获取控制台光标属性的函数,它能返回光标的可见性状态和大小比例,是精细控制控制台光标外观的基础。
BOOL GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);hConsoleOutput:控制台输出句柄(通过GetStdHandle(STD_OUTPUT_HANDLE)获取)
lpConsoleCursorInfo:指向CONSOLE_CURSOR_INFO结构体的指针,用于接收光标信息通过这个函数我们得到了现在光标的信息,下面先介绍一下
CONSOLE_CURSOR_INFO结构体
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 ()
BOOL SetConsoleCursorInfo(
HANDLE hConsoleOutput,
const CONSOLE_CURSOR_INFO* lpConsoleCursorInfo
);可以看到这个函数的变量和上面
GetConsoleCursorInfo()函数是一模一样的,也就是说这两个函数都是在干同一件事情的GetConsoleCursorInfo()函数得到光标信息以后,通过CONSOLE_CURSOR_INFO结构体修改它,而SetConsoleCursorInfo ()就像一个确定键一样,执行它以后,就会设置完成以上修改的信息
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;
}
COORD是WindowsAPI中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕幕缓冲区上的坐标。
typedef struct _COORD {
SHORT X; // 横坐标(水平位置)
SHORT Y; // 纵坐标(垂直位置)
} COORD, *PCOORD;COORD pos = { 10, 15 };坐标系(0,0)的原点位于缓冲区的顶部左侧单元格,而且坐标轴是向右和向下是正方向
通过这个结构体,我们就能定义在屏幕上打印输出的位置
SetConsoleCursorPosition() 是Windows API 中专门用于设置控制台光标位置的函数,通过它可以将光标移动到控制台窗口的任意指定位置,实现精细的文本输出控制。
BOOL SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD dwCursorPosition
);hConsoleOutput:控制台输出句柄(通过GetStdHandle(STD_OUTPUT_HANDLE)获取)
dwCursorPosition:COORD结构体,包含要设置的光标位置坐标(X 为列,Y 为行)具体用法:
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;
}
我们发现每次调整输出位置很麻烦,于是我们封装一个函数:
void Pos(int x,int y)
{
//获得标准输出设备的句柄
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//创建位置pos并修改
COORD pos = { x,y };
//设置光标位置
SetConsoleCursorPosition(houtput, pos);
}GetAsyncKeyState()是 Windows API 中用于检测键盘按键当前状态的函数,它能异步获取指定虚拟键的按下 / 释放状态,是实现实时键盘控制的关键函数。
SHORT GetAsyncKeyState(int vKey);如果我们要判断⼀个键是否被按过,可以检测
GetAsyncKeyState返回值的最低值是否为1, 于是我们定义一个宏:#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )这就是本篇文章的全部内容了,感谢阅读