Bootstrap

win32API(CONSOLE 相关接口详解)

前言:

        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按键是否备被按过!!

;