C语言 控制台API函数

news2024/11/18 12:30:18

目录

  • 前言
  • 1. 句柄 HANDLE
  • 2. 控制台API结构体
    • 2.1 坐标结构 COORD
    • 2.2 光标信息结构 CONSOLE_CURSOR_INFO
    • 2.3 控制台屏幕缓冲区信息结构 CONSOLE_SCREEN_BUFFER_INFO
  • 3. 控制台API函数
    • 3.1 获取句柄 GetStdHandle
    • 3.2 获取光标信息 GetConsoleCursorInfo
    • 3.3 设置光标信息SetConsoleCursorInfo
    • 3.4 设置光标位置 SetConsoleCursorPosition
    • 3.5 获取屏幕缓冲区的信息 GetConsoleScreenBufferInfo
    • 3.6 设置文本属性 SetConsoleTextAttribute
    • 3.7 设置标题 SetConsoleTitle

前言

了解控制台API函数,首先得了解 句柄 HANDL控制台API 结构体

1. 句柄 HANDLE

HANDLE 翻译为 手柄、把手。用在windows开发中,很形象。当抓住(获得)了一个设备的HANDLE(句柄) ,那么就基本可以控制这个设备了。
HANDLE 是一个无类型指针变量,那就是内存地址。在WinNT.h中定义

typedef void *HANDLE;

这里大概知道HANDLE的作用就行了,具体的可以查看句柄的百度百科

2. 控制台API结构体

这里只介绍本文中用到的结构体

2.1 坐标结构 COORD

定义 :定义控制台屏幕缓冲区中字符单元的坐标。 坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。

typedef struct _COORD {
  SHORT X;  	//水平坐标或列值。 单位取决于函数调用。
  SHORT Y; 	//垂直坐标或行值。 单位取决于函数调用。
} COORD, *PCOORD;

2.2 光标信息结构 CONSOLE_CURSOR_INFO

typedef struct _CONSOLE_CURSOR_INFO {
  DWORD dwSize;			//光标的大小
  BOOL  bVisible;   //光标是否可以
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

2.3 控制台屏幕缓冲区信息结构 CONSOLE_SCREEN_BUFFER_INFO

typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
  COORD      dwSize;				//控制台屏幕缓冲区大小 ,这里区别于窗体大小,屏幕缓冲区包括滚动条拉动后能看到的区域
  COORD      dwCursorPosition;	 //屏幕中光标的坐标
  WORD       wAttributes;		//字符的属性(其实就是颜色代码,默认值为07,即黑色背景,白色字体)。 WORD是 unsigned short 类型。在32位系统中为16位长度,62位系统中未 32位
  SMALL_RECT srWindow;  //包含显示窗口左上角和右下角的控制台屏幕坐标的 SMALL_RECT 结构
  COORD      dwMaximumWindowSize; //包含控制台窗口的最大大小(以字符列和行为单位),给定当前屏幕缓冲区的大小和字体以及屏幕大小
} CONSOLE_SCREEN_BUFFER_INFO;

这个结构体的变量可以通过GetConsoleScreenBufferInfo函数获取,详情见3.5章节。

3. 控制台API函数

3.1 获取句柄 GetStdHandle

说明 : 检索指定标准设备的句柄(标准输入、标准输出或标准错误),
原型 :

HANDLE WINAPI GetStdHandle(_In_ DWORD nStdHandl);

返回值 :标准设备的句柄(即标准设备的在内存的映射地址)
参数:nStdHandle是DWORD类型的值,一共就三种

实际值含义
STD_INPUT_HANDLE-10标准输入设备,通常就是键盘
STD_OUTPUT_HANDLE-11标准输出设备 ,通常就是窗体、屏幕等
STD_ERROR_HANDLE-12标准错误设备,通常就是窗体、屏幕等

调用 :

HANDLE handle_output = GetStdHandle(STD_OUTPUT_HANDLE);// 这就获取了console窗体的句柄,此时对handle_output操作,就是对窗体的操作

3.2 获取光标信息 GetConsoleCursorInfo

说明 :获取光标信息
原型 :

BOOL WINAPI GetConsoleCursorInfo(
HANDLE               hConsoleOutput, 	//窗体句柄
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo //光标信息指针,获取到的光标信息就存放在这个指针中
);

3.3 设置光标信息SetConsoleCursorInfo

说明 :设置光标的大小和可见性
原型 :

BOOL WINAPI SetConsoleCursorInfo( 
HANDLE hConsoleOutput, 	// 窗体的句柄
const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo //光标的结构信息
);

示例:

#include <stdio.h>
#include <Windows.h>
#include <conio.h>
int main()
{
	
	HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄
	CONSOLE_CURSOR_INFO cci;        //定义光标信息结构体
	GetConsoleCursorInfo(handle_out, &cci);     //获得当前光标信息
	printf("当前光标大小为%d:\n",cci.dwSize);

	printf("四秒后设置光标大小为1:\n");
	Sleep(4*1000);
	cci.dwSize = 1;     //设置光标尺寸为1
	SetConsoleCursorInfo(handle_out, &cci);
   
	printf("四秒后设置光标大小为50:\n");
	Sleep(4*1000);
	cci.dwSize = 50;    //设置光标尺寸为50
	SetConsoleCursorInfo(handle_out, &cci);

    
	printf("四秒后设置光标大小为100:\n");
	Sleep(4*1000);
	cci.dwSize = 100;   //设置光标尺寸为100
	SetConsoleCursorInfo(handle_out, &cci);
    
	printf("四秒后光标消失...");
	Sleep(4*1000);
	cci.bVisible = 0;       //设置光标为不可见
	SetConsoleCursorInfo(handle_out, &cci);
	getchar();
	return 0;
}

在这里插入图片描述## 设置

3.4 设置光标位置 SetConsoleCursorPosition

说明 :设置光标在窗体的位置。
   有了这个函数,就不必一行一行的输出了,可以自由的定位到窗体的任何位置。这个函数在开发控制台小游戏时,总是会用到。
原型:

BOOL WINAPI SetConsoleCursorPosition(
HANDLE hConsoleOutput,		//窗体句柄
COORD  dwCursorPosition		//设置的光标坐标
);

示例:

#include <stdio.h>
#include <Windows.h>
#include <conio.h>

/*设置光标位置*/
void SetConsoleCursorPositionTest(int x, int y)
{
     COORD pos = {x, y};/* x是横坐标 y是纵坐标 */
      HANDLE handle_output = GetStdHandle(STD_OUTPUT_HANDLE);
     SetConsoleCursorPosition(handle_output,pos);        /* 设置控制台光标坐标(设备句柄, 光标坐标) */
	 printf("光标到这里了");
}

int main()
{
	SetConsoleCursorPositionTest(23, 2);
	getchar();
	return 0;
}

测试结果 :
在这里插入图片描述

3.5 获取屏幕缓冲区的信息 GetConsoleScreenBufferInfo

说明:获取屏幕缓冲区的信息
区别于窗体,屏幕缓冲区,包括滚动条拉动能看到的区域
原型 :

BOOL WINAPI GetConsoleScreenBufferInfo(
	HANDLE                      hConsoleOutput, //控制台句柄
	PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo //屏幕缓冲区信息指针
);

示例:

#include <stdio.h>
#include <Windows.h>
#include <conio.h>

//测试 获取控制台屏幕缓冲区信息GetConsoleScreenBufferInfo()函数
void GetConsoleScreenBufferInfoTest ()
{
    CONSOLE_SCREEN_BUFFER_INFO scr;
    HANDLE handle_output = GetStdHandle(STD_OUTPUT_HANDLE);    /* 获取标准输出句柄 */
    GetConsoleScreenBufferInfo(handle_output, &scr);
    printf("\n当前光标坐标:x=%d  y=%d\n\n", scr.dwCursorPosition.X, scr.dwCursorPosition.Y);
    printf("窗体最大:宽=%d,高=%d\n\n",scr.dwMaximumWindowSize.X, scr.dwMaximumWindowSize.Y);
    printf("屏幕缓冲区: 宽=%d  高=%d\n\n",scr.dwSize.X, scr.dwSize.Y);//这里的高的值很大,因为我们肉眼见到的只是窗体的高,
																    //不是屏幕缓冲区的高,拉动滚动条能够看到的区域才是
    printf("窗体左上角坐标: x=%d y=%d\n\n", scr.srWindow.Left,scr.srWindow.Top);
	printf("窗体右下角坐标: x=%d y=%d\n\n", scr.srWindow.Right,scr.srWindow.Bottom );
    printf("字符属性:%d\n",scr.wAttributes);  //字符的属性(颜色代码)
    
}

int main()
{
	GetConsoleScreenBufferInfoTest ();
	getchar();
	return 0;
}

示例结果:
在这里插入图片描述

3.6 设置文本属性 SetConsoleTextAttribute

说明: 设置控制台文本属性(颜色),可以设置前景色FOREGROUND(文本颜色)和背景色BACKGROUND。有了这个控制台 就不在是黑底白字了,那么单调了。
原型 :

BOOL WINAPI SetConsoleTextAttribute(
  _In_ HANDLE hConsoleOutput,	//控制台句柄
  _In_ WORD   wAttributes		  //无符号短整型的颜色码
);

c语言只有16种颜色,颜色码如下:

    0=黑色    8=灰色  
   1=蓝色    9=淡蓝色           
  2=绿色    10=淡绿色  0xa    
  3=湖蓝色  11=淡浅绿色  0xb 
  4=红色    12=淡红色  0xc  
  5=紫色    13=淡紫色  0xd    
  6=黄色    14=淡黄色  0xe    
  7=白色    15=亮白色  0xf 

第二个参数 wAttributes(颜色属性)使用方式有三种:
a. 使用十六进制方式
因为wAttributes是WORD类型(unsigned short)所以为16位,如0x16。其中高阶位为背景色
低阶位为前景色(字体颜色)

 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x16);//这里的0x16中的1代表蓝色背景色,6代表金色前景色)

可以参照以下的16进制颜色对照表
在这里插入图片描述b. 使用10进制方式

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 26);

在这里插入图片描述3. 使用宏定义方式

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_GREEN|FOREGROUND_BLUE);//使用绿色背景色和蓝色前景色

常用的宏定义的如下:

#define FOREGROUND_BLUE      0x0001 // text color contains blue.
#define FOREGROUND_GREEN     0x0002 // text color contains green.
#define FOREGROUND_RED       0x0004 // text color contains red.
#define FOREGROUND_INTENSITY 0x0008 // text color is intensified.
#define BACKGROUND_BLUE      0x0010 // background color contains blue.
#define BACKGROUND_GREEN     0x0020 // background color contains green.
#define BACKGROUND_RED       0x0040 // background color contains red.
#define BACKGROUND_INTENSITY 0x0080 // background color is intensified.
#define COMMON_LVB_LEADING_BYTE    0x0100 // Leading Byte of DBCS 
#define COMMON_LVB_TRAILING_BYTE   0x0200 // Trailing Byte of DBCS
#define COMMON_LVB_GRID_HORIZONTAL 0x0400 // DBCS: Grid attribute: top horizontal.
#define COMMON_LVB_GRID_LVERTICAL  0x0800 // DBCS: Grid attribute: left vertical.
#define COMMON_LVB_GRID_RVERTICAL  0x1000 // DBCS: Grid attribute: right vertical.
#define COMMON_LVB_REVERSE_VIDEO   0x4000 // DBCS: Reverse fore/back ground attribute.
#define COMMON_LVB_UNDERSCORE      0x8000 // DBCS: Underscore.

基础色
在这里插入图片描述

以COMMON开头的宏变量,只有在64位系统下才能生效。因为64位系统,WORD是32位的。

示例:


#include <stdio.h>
#include <Windows.h>
#include <conio.h>

//设置控制台文本属性(颜色)
void SetConsoleTextAttributeTest()
{
	HANDLE handle_output = GetStdHandle(STD_OUTPUT_HANDLE);    /* 获取标准输出句柄 */
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x16);//这里的0x16中的1代表蓝色背景色,6代表金色前景色)
	printf("\n方式1,十六进制方式: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x16) \n");

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 26);
	printf("\n方式2,十进制方式:  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 26); \n");
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_GREEN|FOREGROUND_RED);

	printf("\n方式3,宏定义方式: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_GREEN|FOREGROUND_RED)");

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
	printf("\n\n我是红色字体");
}

int main()
{
	GetConsoleScreenBufferInfoTest ();
	getchar();
	return 0;
}

在这里插入图片描述

3.7 设置标题 SetConsoleTitle

说明 :设置当前控制台窗口的标题。
原型:

BOOL WINAPI SetConsoleTitle(
  _In_ LPCTSTR lpConsoleTitle
);

示例:

#include <stdio.h>
#include <Windows.h>
#include <conio.h>

//设置控制台文本属性(颜色)
void SetConsoleTitleTest()
{
	HANDLE handle_output = GetStdHandle(STD_OUTPUT_HANDLE);    /* 获取标准输出句柄 */
	SetConsoleTitle("控制台API练习V1.0"); 
}

int main()
{
	GetConsoleScreenBufferInfoTest (); //使用的是3.6章节的测试
	SetConsoleTitleTest();
	getchar();
	return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1692515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦8 RLOG_COMPRESS_LEVEL参数对系统的影响

测试环境是一套主备达梦数据库。下面在主备库分别设置参数进行测试 测试一、 主库设置RLOG_COMPRESS_LEVEL9&#xff0c;备库设置为0。 分别删除主备库的归档日志后执行测试脚本 #当前时间 date disql SYSDBA/SYSDBA:1807 <<EOF #显示归档大小 select sum(free)/1024…

win10无权禁用任务计划程序中的任务

问题说明 最近被win10的自动频繁更新搞得难受&#xff0c;发誓要彻底禁用这个家伙&#xff0c;于是网上找了教程执行&#xff0c;发现执行到禁用windows update计划任务时&#xff0c;提示&#xff1a; 这特么windows这个辣鸡系统&#xff0c;限制还真多&#xff01;&#xf…

❤ Vscode和Idea都可以使用的-AI插件(官方-百度出的)

❤ Vscode和Idea都可以使用的-AI插件&#xff08;官方-百度出的&#xff09; 最新AI特别火&#xff0c;给大家推荐一下最新出的VScode插件&#xff0c;辅助我们写代码&#xff01; 1、下载地址&#xff1a; > https://comate.baidu.com/zh/shopping?inviteCodefkzlak8f …

HarmonyOS-MPChart绘制一条虚实相接的曲线

本文是基于鸿蒙三方库mpchart&#xff08;OpenHarmony-SIG/ohos-MPChart&#xff09;的使用&#xff0c;自定义绘制方法&#xff0c;绘制一条虚实相接的曲线。 mpchart本身的绘制功能是不支持虚实相接的曲线的&#xff0c;要么完全是实线&#xff0c;要么完全是虚线。那么当我…

嵌入式单片机启动地址映射关系

一、内核只会从0地址启动 1.0地址第一个字是sp栈指针,第二个字是Reset_Handler入口,参考图1中启动代码中的中断向量表。具体使用流程参考图2(参考自野火) 图1 图2 2.0地址映射以后,软件上使用0地址访问的空间是映射到的器件的空间 3.0地址映射只会影响单个器件上的地址,…

【C++】09.vector

一、vector介绍和使用 1.1 vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改…

2024/5/25 英语每日一段

Alex Bols of the GuildHE group, representing 60 universities and colleges, said: “As the financial health of the higher education sector becomes ever more challenging, the need for a long-term funding solution becomes ever more urgent. “The increasing co…

鸿蒙HarmonyOS实战-Stage模型(信息传递载体Want)

&#x1f680;前言 应用中的信息传递是为了实现各种功能和交互。信息传递可以帮助用户和应用之间进行有效的沟通和交流。通过信息传递&#xff0c;应用可以向用户传递重要的消息、通知和提示&#xff0c;以提供及时的反馈和指导。同时&#xff0c;用户也可以通过信息传递向应用…

Prometheus+Grafana监控服务器、mysql数据库并配置报警规则推送邮箱

文章目录 一、安装prometheus1.1下载1.2 安装1.3 开机启动1.4 验证 二、安装 Grafana2.1 下载2.2 安装2.3 启动2.4 验证 三、安装服务器监控 node_exporter3.1 下载3.2 安装3.3 设置 node_exporter 系统服务3.4 设置开机自动启动3.5 验证3.6配置Prometheus3.7 修改 Prometheus …

海外新闻媒体发稿,PR稿件海外投稿,国外软文宣发-需综合考虑发布平台/内容质量/SEO策略/目标受众/发布时间/效果监控以及媒体关系等多个方面

发布新闻稿是提升品牌知名度和影响力的重要手段。以下是一些在国外新闻稿发布的干货分享&#xff0c;帮助你更有效地进行海外PR发稿。 1. 选择合适的发布平台 选择一个合适的新闻稿发布平台是关键&#xff0c;不同的平台有不同的覆盖范围和目标受众。以下是一些推荐的平台&am…

Java进阶学习笔记8——单继承、Object类、方法重写

Java 是单继承的&#xff0c;Java中的类不支持多继承&#xff0c;但是支持多层继承。 Object类是所有类的父类。 Java不支持多类继承&#xff1a; Java支持多层继承&#xff1a; 反证法&#xff1a; Object类&#xff1a; Object类是java所有类的祖宗类&#xff0c;我们写的任…

HCIP-Datacom-ARST自选题库__ISIS判断【23道题】

1.IS-1S快速收敛是为了提高路由的收敛速度而做的扩展特性&#xff0c;包含PRC和I-SPF&#xff0c;其中PRC只对发生变化的路由进行重新计算&#xff0c;而I-SPF只对受影响的节点进行路由计算。√ 2.在I5-S协议视图下配置ipv6 preference&#xff0c;该命令的作用是配置|5-IS协议…

卷积神经网络-奥特曼识别

数据集 四种奥特曼图片_数据集-飞桨AI Studio星河社区 (baidu.com) 中间的隐藏层 已经使用参数的空间 Conv2D卷积层 ReLU激活层 MaxPool2D最大池化层 AdaptiveAvgPool2D自适应的平均池化 Linear全链接层 Dropout放置过拟合&#xff0c;随机丢弃神经元 -----------------…

打包要求 minCompileSdk 使用指定版本及以上

我当前的 compileSdkVersion 30&#xff0c;因为依赖了 androidx.core:core:1.9.0 它要求最低 compileSdkVersion 33。 那么如果我不想升级 compileSdkVersion 应该怎么办&#xff1f; 答&#xff1a;当然是降低 core:core 版本&#xff01; 看看谁依赖了这两个版本 android…

JavaSE——类和对象(二)~~封装

目录 一.封装 二.封装扩展之包 三.static成员 四. 代码块 五. 内部类&#xff08;重要&#xff09; 大家好呀&#xff0c;我是北纬&#xff0c;接着上节我们继续讲解Java中关于类和对象的相关知识&#xff0c;今天着重给大家介绍一下关于面向对象程序的特性之一——封装。…

FPGA 纯逻辑arinc818 ip core

1、 符合FC-FS、FC-AV、FC-ADVB协议规范&#xff1b; 2、符合ARINC818协议规范&#xff1b; 3、支持光纤通信Class1、Class3服务&#xff1b; 5、可动态配置光纤端口速率&#xff0c;支持1.0625Gbps、2.125Gbps、3.1875Gbps、4.25Gbps可配置&#xff1b; 6、DDR控制接口简洁…

【01】全面理解JVM虚拟机

一、前言 学习JVM是进行JVM调优的基础。写的代码部署到线上它会如何运行&#xff1f;要配多少内存&#xff1f;线上环境出问题了&#xff0c;服务崩溃了&#xff0c;应该怎么快速定位&#xff1f;这些问题都与JVM有着一定的关系。好的程序员都应该尽自己的能力把JVM每个底层逻…

记录github小程序短视频系统的搭建过程

GitHub - lkmc2/AwesomeVideoWxApp: 《倾心短视频》微信小程序 这个项目按readme中的来可以部署成功&#xff0c;但是会发现图片、视频全是空的&#xff0c;如下图&#xff1a; 修改源代码&#xff0c;更换图片上传与保存地址 大概涉及到这些代码块&#xff0c;进行更改即可。…

HarmonyOS interface router scale pageTransition SlideEffect.Left ArkTS ArkUI

&#x1f3ac;️create Component export default struct TitleBar {build(){Row(){Text(transition).fontSize(30fp).fontColor(Color.White)}.width(100%).height(8%).backgroundColor(#4169E1).padding({left:10})}}&#x1f39e;️interface export interface IList{ti…

【zotero6】ZotCard笔记模板分享

zotcard插件下载链接&#xff1a;传送门 因为zotero出了新的zotero7&#xff0c;现在下载插件会出现zotero6和zotero7不兼容的情况&#xff0c;通过这个链接可以区分适配不同版本的插件。 下载后点击工具的附加组件 然后选择通过文件添加 就可以添加插件了 再通过 工具->…