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