目录
win32 API :
什么是API :
控制台:
控制台与VS:
控制台的控制:
控制台窗口设置:
1、mode函数:
2、title 函数:
在C语言中的实现:
控制台的坐标设置:
COODR函数:
原型:
控制台的坐标图:
坐标赋值:
在C语言中的实现:
获取控制台的权限:
GetStdHandle:
原型:
在C语言中的实现:
获取控制台的光标信息和大小:
GetConsoleCursorInfo:
原型:
CONSOLE_CURSOR_INFO:
CONSOLE_CURSOR_INFO 结构体:
字符单元格百分比:
设置控制台的光标大小和可见性:
SetConsoleCursorInfo:
原型:
在C语言中的使用:
设置控制台的光标位置 :
SetConsoleCursorposition:
使用:
效果:
获取按键情况:
虚拟键盘:
GetAsyncKeyState:
原型:
用宏定义进行判断按键的按压情况:
实例:
win32 API :
Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外,它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以便称之为 Application ProgrammingInterface,简称 API函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。
什么是API :
每一种操作系统在完成正常的操作系统该有的功能,如果文件管理、内存管理,等等还提供了一些接口(函数),这些函数提供给程序员,让成员自己调用,能够实现一些自己想要的功能。
而这些接口就是API
控制台:
控制台又名cmd程序,又叫终端。
控制台与VS:
我们在VS程序中,创建的空白项目,其实就是在控制台内部进行创建的。
控制台的控制:
控制台窗口设置:
1、mode函数:
功能:在控制台界面中我们使用mode函数对控制台的大小进行控制。
mode con cols=100 lines=30
- 如上代码,cols代表列数,lines代表行数,意思是将控制台的窗口变为100列 30行的大小
注意事项:在最新版的win11版本中,控制台的大小被刻意的设置成了 "按照windos 设置",所以无法通过我们输入的指令进行大小的修改。
所以我们要将控制台进行重新设置:
- 进行保存后记得重新启动控制台!
效果如下:
2、title 函数:
功能:title是对控制台的名字进行设置。
title 贪吃蛇
在C语言中的实现:
在C语言中我们使用system()函数来控制控制台的大小设置和标题设置,记得写上<stdib.h>作为头文件。
#include <stdio.h>
int main()
{
//设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,30⾏,100列
system("mode con cols=100 lines=30");
//设置cmd窗⼝名称
system("title 贪吃蛇");
return 0;
}
控制台的坐标设置:
COODR函数:
介绍:COORD 是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕幕缓冲区上的坐标,坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。
原型:
typedef struct _COORD
{
SHORT X;
SHORT Y;
} COORD, *PCOORD;
控制台的坐标图:
- 如图所示,这个和数学的坐标系有些不同,x越往右边越大而且是正数,越往下面越大,而且是正数。
坐标赋值:
COORD pos ={ 3 ,5 };
在C语言中的实现:
#include <stdio.h>
int main()
{
COORD pos ={ 3,5 };
return 0;
}
获取控制台的权限:
GetStdHandle:
GetStdHandle是一个Windows API函数。它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),使用这个句柄可以操作设备。
而控制台就是一个标准输出的设备。
原型:
HANDLE GetstdHandle(DWORD nStdHandle);
- HANDLE是一种类型
- 如果要控制控制台内部的设置,我们就得取得控制台的权限。
- 例如在控制台中的光标消失,或者在控制台中的某个地方出现字符,而GetStdHandle就是干这个的。
在C语言中的实现:
#include <stdio.h>
int main()
{
HANDLE handle = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
handle = GetStdHandle(STD_OUTPUT_HANDLE);
//handle是一种指针,HANDLE是一种类型专门针对GetStdHandle
return 0;
}
获取控制台的光标信息和大小:
GetConsoleCursorInfo:
功能:检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息。
原型:
BOOL WINAPI GetConsoleCursorInfo( HANDLE hConsoleOutput, PCONSOLE_CURSOR_INFO lpConsoleCursorInfo );
- PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针。
- 而 CONSOLE_CURSOR_INFO 是一个结构体,内部存储控制台光标信息和大小。
CONSOLE_CURSOR_INFO:
CONSOLE_CURSOR_INFO 结构体:
typedef struct _CONSOLE_CURSOR_INFO
{
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
- *PCONSOLE_CURSOR_INFO 是将 struct CONSOLE_CURSOR_INFO * 这个指针类型进行重命名后的名字,执行 CONSOLE_CURSOR_INFO 这个结构体。
- dwSize,由光标填充的字符单元格的百分⽐。 此值介于1到100之间。 光标外观会变化,范围从完 全填充单元格到单元底部的⽔平线条。
- bVisible,游标的可⻅性。 如果光标可⻅,则此成员为 TRUE。
- 使光标不可见则为 :CursorInfo.bVisible = false;
- 因为要使用false 所以我们需要使用头文件 <bool.h>
注意:上面的代码将光标结构体进行了重命名 !
字符单元格百分比:
和光标相比,光标只占了字符单元格的百分之几
设置控制台的光标大小和可见性:
SetConsoleCursorInfo:
功能:设置指定控制台屏幕缓冲区的光标的大小和可见性.
原型:
BOOL WINAPI SetConsoleCursorInfo( HANDLE hConsoleOutput, const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo );
如以上代码,我们得知该函数有两个参数,一个是获取了控制台权限的变量,表示需要修改的控制台,另一个是光标信息结构体的变量指针 。
在C语言中的使用:
#include <stdio.h> #include <bool.h> int main() { HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //影藏光标操作 CONSOLE_CURSOR_INFO CursorInfo; //获取控制台光标信息 GetConsoleCursorInfo(hOutput, &CursorInfo); //隐藏控制台光标 CursorInfo.bVisible = false; //设置控制台光标状态 SetConsoleCursorInfo(hOutput, &CursorInfo); return 0; }
只有写出了设置,才能将光标信息进行修改,在设置光标函数中,他的参数有两个,前一个是取得控制台权限的变量和光标的信息结构体地址,对了要先将光标进行修改哦!
设置控制台的光标位置 :
SetConsoleCursorposition:
功能:设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用SetConsoleCursorPosition函数将光标位置设置到指定的位置。
使用:
#include <stdio.h> #include <bool.h> int main() { HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos = { 5,20 }; SetConsoleCursorPosition( hOutput ,pos); int ch = getchar(); putchar(ch); return 0; }
效果:
获取按键情况:
虚拟键盘:
在win32 api中键盘上的每一个键都是编了号的。
虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learnhttps://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes
- 如上图所示,0x26等十六进制数字就是虚拟键盘的编号。
GetAsyncKeyState:
功能: 函数接收后按键的键盘编号后,进行返值,而返回的值是short类型,而我们可以通过它的返回值的16位比特位中的最高位和最低位进行判断,按键是按下还是刚刚按过,还是没有按。
原型:
SHORT GetAsyncKeystate(int vKey);
用宏定义进行判断按键的按压情况:
//PRESS_KET 来检测vk这虚拟键值对应的按健是否被按过
//使用&的方法,和三目运算符 如果和1&得出的结果是1 那么就输出1 表示按下了,反之表示没按下
//如果按过返回1,未按过返回0
#define PRESS_KET(vk) (GetAsyncKeyState(vk) & 0x1 ? 1:0)
C语言 位操作符 & | ^ ~-CSDN博客https://blog.csdn.net/2301_76445610/article/details/132133124?spm=1001.2014.3001.5501
实例:
- 别忘记头文件<windows.h>
#include <stdio.h>
#include <windows.h>
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;
}
这段代码的意思就是,当我们按下数字键的时候,通过获取数字键状态的函数进行判断,如果我们按下了数字键,就会打印除相对应的数字 。