WinAPI 极简教程:超简单的 Windows 接口入门

欢迎来到 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)获取)
    dwCursorPositionCOORD结构体,包含要设置的光标位置坐标(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 )
这就是本篇文章的全部内容了,感谢阅读


  • 本节完...
相关推荐
星轨初途3 小时前
数据结构二叉树之链式结构(3)(下)
c语言·网络·数据结构·经验分享·笔记·后端
晨枫阳3 小时前
不同语言数组详解
linux·服务器·windows
fashion 道格3 小时前
深入理解数据结构:单链表的 C 语言实现与应用
c语言·数据结构
s***4533 小时前
【RabbitMQ】超详细Windows系统下RabbitMQ的安装配置
windows·分布式·rabbitmq
yuuki2332334 小时前
【C语言&数据结构】二叉树的链式递归
c语言·数据结构·后端
智者知已应修善业4 小时前
【51单片机LED贪吃蛇】2023-3-27
c语言·c++·经验分享·笔记·嵌入式硬件·51单片机
福尔摩斯张13 小时前
Axios源码深度解析:前端请求库设计精髓
c语言·开发语言·前端·数据结构·游戏·排序算法
IT小哥哥呀13 小时前
如何从 Windows SSH 进入 VirtualBox Ubuntu 虚拟机——密码认证(逐步指南)
linux·windows·ubuntu·ssh·教程·虚拟机
XI锐真的烦13 小时前
Flutter Windows 下“Running Gradle task ‘assembleDebug‘...” 卡住一整天的终极解决办法
windows·flutter