目录
2,GetConsoleCursorInfo 与 SetConsoleCursorInfo
一,Win32 API 简介
Win32 API 即Microsoft Windows 32位平台的Application Programming Interface(即应用程序接口);在Windows这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外,它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),它可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以被称为 Application Programming Interface 。简称API函数。
二,控制台程序(console)
当我们按住键盘上的 Win 加 R 时输入 cmd ,即可得一个黑框的程序,该程序就是控制台程序;
mode命令
通过使用 cmd 命令,我们可以设置控制台窗口的大小、长宽,在C语言中同样适用:
在c语言中(VS2022),输入以下代码便可以改变控制台大小:
int main()
{
system("mode con cols=30 lines=60");
}
在Windows中,输入以下亦可:
mode con cols=30 lines=60
title命令
在C语言中,输入以下可以改变控制台标题:
int main()
{
system("title 标题");
}
前:后:
在Windows中仅需输入:
title 标题
即可。
注意:
1,这些能在控制台窗口执行的命令,在C语言中使用时,要调用 system 函数来执行(system函数可以用来执行系统命令);
2,在代码编写时程序运行是,如果要边写边查看输出效果,要用 getchar 函数(system(“pause”)亦可)来阻止程序的结束(当程序结束时原来想要设置的标题会变回默认标题)
三,控制台屏幕上的坐标(COORD)
COORD是Windows API 中定义的一个结构体,表示一个字符在控制台屏幕缓冲区上的坐标,坐标原点(0,0)位于缓冲区顶部左侧单元格;值得注意的是,X轴向右,Y轴向下:
COORD类型的声明:
typedef struct _COORD
{
short X;
short Y;
}COORD,*PCOORD;
注意:
- 该声明在头文件 windows.h 中已经存在,无需在程序中声明,直接使用。
- x,y 坐标均为 short 类型
COORD的使用:
COORD pos1 = { 10 , 20 };
COORD pos2 = { 15 , 10 };
四,Win32 API 函数
1,GetStdHandle
GetStdHandle 是一个Windows API 函数,Get standard handle,用于从一个特定的标准设备(标准输入、标准输出、标准错误)中取得一个句柄(用于识别不同设备的数值)(理解为手柄),使用该句柄可以操作设备。
定义:
HANDLE GetStdHandle(DWORD nStdHandle);
注意:HANDLE 属于 void* 类型
参数:
参数 | 含义 |
---|---|
STD_INPUT_HANDLE((DWORD)-10) | 标准输入设备。 最初,这是输入缓冲区 CONIN$ 的控制台。 |
STD_OUTPUT_HANDLE((DWORD)-11) | 标准输出设备。 最初,这是活动控制台屏幕缓冲区 CONOUT$ 。 |
STD_ERROR_HANDLE((DWORD)-12) | 标准错误设备。 最初,这是活动控制台屏幕缓冲区 CONOUT$ 。 |
当我们想操作某个标准设备便可以输入以上对应参数,如:我要后续对程序输出的屏幕进行操作,则选择标准输出,即参数为:STD_OUTPUT_HANDLE。
使用:
#include<Windows.h>
int main()
{
HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
}
所得的返回值 houtput 即为句柄。
2,GetConsoleCursorInfo 与 SetConsoleCursorInfo
GetConsoleCursorInfo
即获取控制台(console)光标(cursor)信息(information);用于检索有关指定控制台屏幕缓冲区的光标大小以及可见性的信息。
参数:
BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput,//参数一
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo//参数二
);
- 参数一,即句柄,依此来确认操作设备对象;
- 参数二,PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标(光标)的信息。
CONSOLE_CURSOR_INFO
这个结构体( Windows.h 中已经声明),包含有关控制台光标的信息 :
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;//成员一
BOOL bVisible; //成员二
}CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
- 成员一( dwSize),由光标填充的字符单元格的百分比。此值介于1到100之间。光标外观会变化,范围从完全填充单元格到单元底部的水平线条。
- 成员二(bVisible),表示游标的可见性。 如果光标可见,则此成员为 TRUE(默认),光标不可见则为 FALSE(注意:此时为布尔类型,要包含头文件 stdbool.h )。
SetConsoleCursorInfo
用于设置控制台屏幕缓冲区的光标大小与可见性,参数与 GetConsoleCursorInfo 一致。
实际使用:
#include<stdbool.h>
#include<Windows.h>
int main()
{
//得到句柄
HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//定义一个光标信息的结构体
CONSOLE_CURSOR_INFO cursor_info = { 0 };
//获取与 houtput 对应控制台上光标信息,存放在 cursor_info 中
GetConsoleCursorInfo(houtput, &cursor_info);
//修改光标信息
cursor_info.dwSize = 100;
cursor_info.bVisible = TURE;
//设置与句柄对应控制台上的光标信息
SetConsoleCursorInfo(houtput, &cursor_info);
system("pause");
return 0;
}
注意:
- SetConsoleCursorInfo 的第二个参数为指针,记得取地址符号 & 。
- 对于光标信息的修改要先获取,再修改,再设置。
3,SetConsoleCursorPosition
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在 COORD 类型的 pos 中,调用 SetConsoleCursorPosition 函数将光标位置设置到指定的位置。
BOOL WINAPI SetConsoleCursorPosition(
HANDLE hConsoleOutput,//参数一
COORD pos//参数二
);
- 参数一,即句柄,用于确定操作对象;
- 参数二,指定新光标位置(以字符为单位)的 COORD 结构。 坐标是屏幕缓冲区字符单元的列和行。 坐标必须位于控制台屏幕缓冲区的边界以内。
使用:
#include<Windows.h>
int main()
{
//得到句柄
HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置坐标
COORD pos = { 20,20 };
//执行
SetConsoleCursorPosition(houtput, pos);
system("pause");
return 0;
}
注意:倘若在光标前有字符打印则首字符的位置为设置的光标坐标。
为了更加简便得更改光标坐标,我们可以封装一个函数 SetPos ,使用时仅需传入坐标:
#include<Windows.h>
void SetPos(short x, short y)
{
//得到句柄
HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置坐标
COORD pos = { x,y };
//执行
SetConsoleCursorPosition(houtput, pos);
}
int main()
{
SetPos(10, 20);
return 0;
}
4,GetAsyncKeyState
即 get asynchonous key state (获取异步按键状态)
short GetAsyncKeyState( int vKey );
用法是,将键盘上每个键的虚拟值传递给函数,函数通过返回值来分辨按键状态。
规则是:GetAsyncKeyState 的返回值是short类型,在上⼀次调用 GetAsyncKeyState 函数后, 如果返回的16位的short数据中:
- 最高位是1,说明按键的状态是按下,
- 如果最高位是0,说明按键的状态是抬起;
- 如果最低位被置为1则说明,该按键被按过,否则为0。
如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1.
使用时一般利用宏定义的用法:
#include <stdio.h>
#include <windows.h>
#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;
}
注意;
- 在使用该函数时,一般会涉及 按位或(|)、按位与(&) 等等。
-
参考虚拟键值表