首页 > 其他分享 >win32API(CONSOLE 相关接口详解)

win32API(CONSOLE 相关接口详解)

时间:2024-06-23 18:28:47浏览次数:27  
标签:字符 CONSOLE 函数 hOutput 详解 printf 控制台 光标 win32API

前言:

        Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程式达到开启视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application),所以便称之为ApplicationProgrammingInterface,简称API函数。

WIN32API也就是MicrosoftWindows32位平台的应⽤程序编程接⼝。

 控制台程序

什么是控制台程序?

平常我们运⾏起来的⿊框程序其实就是控制台程序。

修改设置控制台程序的名称:

在官方Windows console(控制台)中可以查阅相关控制台操作的相关函数!

返回值:

该函数的返回值是BOOL类型,也就是成功的话返回true(1),失败的话返回false(0)

参数:

这里参数就是需要传入字符串指针。

注意:

宽字符的讲解:

这里的字符串由于可以是任意的符号、数字、汉字、英文、等等特殊符号,但是由于ASCALL表中一共是127个字符,一个char类型是1个字节,8个比特位最高位为0,所以最大可容纳127个字符,

但是由于国家不同,每个国家有自己的语言体系,比如中国大约有10万汉字,char类型根本不够用,就算是把最高位也用起来,char类型也只能包含256个字符,也是不够用的

所以国际商议出"宽字符",也就是一个字符占2个字节,也就是16个比特位,但是还是不够,但是这16个比特位足描述常用字符。

于是字符就分为了两种:

1、窄字符:

类型:char类型

大小:1个字节

符合ASCALL表

2、宽字符:

类型:wchar_t

大小:2个字节

在定义字符串时同时也是两种形式:

窄字符用" "包裹。

宽字符用 L" "包裹。

在C++中就偶两套函数处理两种字符串:

比如:strlen计算窄字符串的大小。

           wcslen计算宽字符串的大小

当然微软将这两种字符进行了统一,就有了TCAHR类型,就有了_T("")这样的字符串

通过条件编译(通过_UNICODE和UNICODE宏)控制实际使用的字符集。

当没有定义_UNICODE宏时,TCHAR = char,_tcslen =strlen
当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen

在使用SetConsoleTitle函数的时候参数传的是哪种类型呢?

先用常量字符型试试看!

int main()
{
	SetConsoleTitle("cccc");
	return 0;
}

结果报错:

这里的LPCWSTR是什么呢?

通过查阅:

LPCSTR是Win32和VC++所使用的一种字符串数据类型。LPCSTR被定义成是一个指向以'\0'结尾的常量字符的指针。

LPWSTR是wchar_t字符串。

LPCWSTR是一个指向unicode编码字符串的32位指针,所指向字符串是wchar型,而不是char型。

LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的64位双字节字符数组指针

也就是SetConsoleTitle函数必须使用宽字符,也就是wchar_t类型。

int main()
{
	SetConsoleTitle(L"cccc");
	return 0;
}

注解:

也就是我们控制台标题还有一种旧方法:
就是用title 的方式命名

可以在编译器中输入:

#include<windows.h>
int main()
{
	/*SetConsoleTitle(L"cccc!!");*/
	system("title cccc");
	return 0;
}

控制台屏幕上的坐标COORD

        想要控制光标的位置,就需要用坐标来表示,微软提供了COORD结构,也就是坐标的结构体。

一个是类型COORD的结构体,一个是PCCOOED的指针。

在我们使用的时候,只需要定义一个结构体变量,例如:

#include<windows.h>
int main()
{
	COORD pc = { 10,20 };
	printf("ccc");
	return 0;
}

GetStdHandle(操作柄) 函数:

        该函数是获取标准设备的句柄,也就是获取操作控制台的外部设备信息,我们使用键盘操作控制台,使得我们对控制台有使用权限。

        

返回值是HANDLE类型的结构体变量。

例如:

#include<windows.h>
int main()
{
	HANDLE hOutput = NULL;
	//获取标准输出的句柄(⽤来标识不同设备的数值)
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	return 0;
}

GetConsoleCursorInfo (获取光标)函数:

   检索有关指定控制台屏幕缓冲区的游标大小和可见性的信息.

参数有两个:

1、操作柄对应的返回值。

2、光标信息的指针。

#include<windows.h>
int main()
{
	HANDLE hOutput = NULL;
	//获取标准输出的句柄(⽤来标识不同设备的数值)
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;//光标的相关信息,包括光标的大小,光标的可见性
	GetConsoleCursorInfo(hOutput,&hOutput);//获取控制台光标信息
	return 0;
}

CONSOLE_CURSOR_INFO(光标信息)结构体

        想要对光标进行修改,必须了解光标对应的函数,里面都有哪些内容。

dwSize
由游标填充的字符单元的百分比。 该值介于 1 到 100 之间。 游标外观各不相同,范围从完全填充单元到显示为单元底部的横线。

bVisible
游标的可见性。 如果游标可见,则此成员为 TRUE

SetConsoleCursorInfo (设置光标)函数:

传入的参数和SetConsoleCursorInfo传入的参数是一样的。

int main()
{
	HANDLE hOutput = NULL;
	//获取标准输出的句柄(⽤来标识不同设备的数值)
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;//光标的相关信息,包括光标的大小,光标的可见性
	GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
	CursorInfo.bVisible = FALSE;//修改信息
	SetConsoleCursorInfo(hOutput, &CursorInfo);//设置信息
	return 0;
}

光标消失了。

SetConsoleCursorPosition(设置光标位置)函数

配合COORD函数使用!

int main()
{
	HANDLE hOutput = NULL;
	//获取标准输出的句柄(⽤来标识不同设备的数值)
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;//光标的相关信息,包括光标的大小,光标的可见性
	GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
	CursorInfo.dwSize = 100;
	SetConsoleCursorInfo(hOutput, &CursorInfo);//设置信息
	COORD pos = { 10,20 };
	SetConsoleCursorPosition(hOutput,pos);//设置光标位置
	int ch = getchar();//获取输入
	putchar(ch);//输出
	return 0;
}

效果如下:

GetAsyncKeyState(获取键盘按键)函数:


获取按键情况,GetAsyncKeyState的函数原型如下:
SHORT GetAsyncKeyState( 

int vKey);
将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。

GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,

如果返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;

如果最低位被置为1则说明,该按键被按过,否则为0。
如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1.

可以写出一个检测有没有被按过的函数:

每个按键对应的值为:

#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
int main()
{
	while (1)
	{
		if (KEY_PRESS(0x30))
		{
			printf("0\n");
		}
		else if (KEY_PRESS(0x31))
		{
			printf("1\n");
		}
		else if (KEY_PRESS(0x32))
		{
			printf("2\n");
		}
		else if (KEY_PRESS(0x33))
		{
			printf("3\n");
		}
		else if (KEY_PRESS(0x34))
		{
			printf("4\n");
		}
		else if (KEY_PRESS(0x35))
		{
			printf("5\n");
		}
		else if (KEY_PRESS(0x36))
		{
			printf("6\n");
		}
		else if (KEY_PRESS(0x37))
		{
			printf("7\n");
		}
		else if (KEY_PRESS(0x38))
		{
			printf("8\n");
		}
		else if (KEY_PRESS(0x39))
		{
			printf("9\n");
		}
	}
	return 0;
}

可在电脑上监视0~9按键是否备被按过!!

标签:字符,CONSOLE,函数,hOutput,详解,printf,控制台,光标,win32API
From: https://blog.csdn.net/m0_75235246/article/details/139889078

相关文章

  • nginx架构&&基本数据结构&&配置&&模块&&请求详解
    初探nginx架构众所周知,nginx性能高,而nginx的高性能与其架构是分不开的。那么nginx究竟是怎么样的呢?这一节我们先来初识一下nginx框架吧。nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。我们也可以手动地关掉后台模式,让ng......
  • 初阶《操作符详解》 3. 移位操作符
    3.移位操作符<< 左移操作符>> 右移操作符注:移动的是二进制位,移位操作符的操作数只能是整数。一个存储的二进制码分原码、反码、补码1.十进制数据的二进制表现形式就是原码,原码最左边的一个数字就是符号位,0为正,1为负。2.正的整数的原码、反码、补码相同3.负的......
  • JUC锁: 锁核心类AQS详解
    AbstractQueuedSynchronizer抽象类是核心,需要重点掌握。它提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。@立刀旁目录#带着BAT大厂的面试问题去理解#AbstractQueuedSynchronizer简介#AQS核心思想#AQS对资源的共享方式#AQS底层使用了模......
  • 数据库系统概论(超详解!!!) 第十四节 数据库并发控制机制
    多用户数据库系统:允许多个用户同时使用的数据库系统例:飞机定票数据库系统银行数据库系统特点:在同一时刻并发运行的事务数可达数百上千个多事务执行方式:(1)事务串行执行每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行。不能充分利用系统资源,发挥数据库......
  • Android 事件分发机制详解(下)
    2.3View事件分发机制从上面ViewGroup事件分发机制知道,View事件分发机制从dispatchTouchEvent()开始源码分析/***源码分析:View.dispatchTouchEvent()*/publicbooleandispatchTouchEvent(MotionEventevent){if((mViewFlags&ENABLED_MASK)......
  • JavaSE 面向对象程序设计进阶 继承和方法重写 2024理论与内存详解
    继承面向对象三大特征:封装继承多态封装:对象代表什么,就封装对应的数据,并提供数据对应的行为,把零散的数据变成一个整体为什么要继承两个类中重复的代码(数据和方法)太多,所以要继承extend关键字类与类之间的父子关系让一个类和另一个类建立起继承关系publicclassStude......
  • 【数据结构与算法】图论 详解
    何为完全图、稀疏图、稠密图。完全图:完全图是一种简单的无向图,其中每对不同的顶点之间都恰好有一条边。对于有n个顶点的完全图,它包含n(n-1)/2条边。在有向图中,如果任意两个顶点之间都存在方向相反的两条边,包含n(n-1)条边,则该图被称为有向完全图。稀疏图:稀疏图是边数相......
  • 【数据结构与算法】图的存储(邻接矩阵,邻接表)详解
    图的邻接矩阵数据结构typedefenum{NDG,DG,NDN,DN}GraphKind;usingVRType=int;usingInfoType=int;typedefstructArcCell{ VRTypeadj; InfoType*info;}Arc[N][N];structMGraph{ ElemTypevexs[N]; Arcarc; intvexnum,arcnum; GraphKi......
  • Transformer细节(六)——详解Transformer各层结构和组成
    Transformer模型的架构是由多个编码器(Encoder)和解码器(Decoder)层堆叠而成的。一、编码器(Encoder)        编码器由多个相同的编码器层(EncoderLayer)堆叠而成。每个编码器层包含两个主要子层:自注意力(Self-Attention)子层和前馈神经网络(FeedForwardNeuralNetwork,FFN)子......
  • 学懂C#编程:常用高级技术——委托(Delegate)应用场景——委托与Lambda表达式的结合使用详
            在C#中,委托与Lambda表达式的结合使用是现代编程实践中的一个重要且强大的特性,它极大地提高了代码的简洁性和可读性。下面将详细讲解这两个概念如何协同工作,以及如何在实际编程中有效利用它们。委托基础        委托是C#中的一种引用类型,它允许封装一......