Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows32位平台的应⽤程序编程接⼝。
1.控制台程序
平常我们运⾏起来的⿊框程序其实就是控制台程序。
我们可以使⽤cmd命令来设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,30⾏,100列。
也可以通过命令设置控制台窗⼝的名字:
![](https://i-blog.csdnimg.cn/blog_migrate/f1f5b96764201a852950aeaefb4d69cf.png)
2.控制台屏幕上的坐标COORD
COORD 是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕上的坐标。
![](https://i-blog.csdnimg.cn/blog_migrate/d8cc686089733d61bce8e13c85f88a82.png)
给坐标赋值:
COORD pos = {
10
,
15
};
3.GetStdHandle
GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。
函数原型:HANDLE
GetStdHandle
(DWORD nStdHandle);
实例:
HANDLE hOutput =
NULL
;
//
获取标准输出的句柄
(
⽤来标识不同设备的数值
)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
4.GetConsoleCursorInfo
检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息。
函数原型:BOOL WINAPI
GetConsoleCursorInfo
(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo);
第一个参数为句柄,第二个参数为存储控制台光标信息的结构体指针。
结构体原型:typedef struct
_
CONSOLE_CURSOR_INFO
{
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
dwSize,由光标填充的字符单元格的百分⽐。 此值介于1到100之间。 光标外观会变化,范围从完
全填充单元格到单元底部的⽔平线条。
bVisible,游标的可⻅性。 如果光标可⻅,则此成员为 true。
CursorInfo.bVisible =
false
;
//
隐藏控制台光标
实例:
HANDLE hOutput =
NULL
;
//
获取标准输出的句柄
(
⽤来标识不同设备的数值
)
hOutput =
GetStdHandle
(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo
(hOutput, &CursorInfo);
//
获取控制台光标信息
5.SetConsoleCursorInfo
设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性。
函数原型:BOOL WINAPI
SetConsoleCursorInfo
(HANDLE hConsoleOutput,
const
CONSOLE_CURSOR_INFO *lpConsoleCursorInfo);
第一个参数为句柄,第二个参数为存储控制台光标信息的结构体指针。
实例:
HANDLE hOutput =
GetStdHandle
(STD_OUTPUT_HANDLE);
//
影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo
(hOutput, &CursorInfo);
//
获取控制台光标信息
CursorInfo.bVisible =
false
;
//
隐藏控制台光标
SetConsoleCursorInfo
(hOutput, &CursorInfo);
//
设置控制台光标状态
6.SetConsoleCursorPosition
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调⽤SetConsoleCursorPosition函数将光标位置设置到指定的位置。
函数原型:BOOL WINAPI
SetConsoleCursorPosition
(HANDLE hConsoleOutput,
COORD pos);
第一个参数为句柄,第二个参数为坐标
实例:
COORD pos = {
10
,
5
};
HANDLE hOutput =
NULL
;
//
获取标准输出的句柄
(
⽤来标识不同设备的数值
)
hOutput =
GetStdHandle
(STD_OUTPUT_HANDLE);
//
设置标准输出上光标的位置为
pos
SetConsoleCursorPosition
(hOutput, pos);
因为每一次使用均需创建坐标和句柄,通常定义函数SetPos:封装⼀个设置光标位置的函数
//
设置光标的坐标
void
SetPos
(
short
x,
short
y)
{
COORD pos = { x, y };
HANDLE hOutput =
NULL
;
//
获取标准输出的句柄
(
⽤来标识不同设备的数值
)
hOutput =
GetStdHandle
(STD_OUTPUT_HANDLE);
//
设置标准输出上光标的位置为
pos
SetConsoleCursorPosition
(hOutput, pos);
}
7.GetAsyncKeyState
获取按键情况
函数原型:SHORT
GetAsyncKeyState
(
int
vKey);
vkey为虚拟键值,键盘上每一个按键对应一个值,例如
![](https://i-blog.csdnimg.cn/blog_migrate/351eb10ba2e03685d188e936d9648998.png)
使用时可以用虚拟键名称,十六进制,十进制,通常使用虚拟键名称
GetAsyncKeyState
的返回值是short类型,在上⼀次调⽤
GetAsyncKeyState
函数后,如果
返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。
如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1.
于是可以定义这样一个宏
#
define
KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )