Win32 API 及其部分函数

目录

一,Win32 API 简介

二,控制台程序(console)

三,控制台屏幕上的坐标(COORD)

四,Win32 API 函数

1,GetStdHandle

2,GetConsoleCursorInfo 与 SetConsoleCursorInfo

3,SetConsoleCursorPosition

4,GetAsyncKeyState


一,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,GetConsoleCursorInfoSetConsoleCursorInfo

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. 最高位是1,说明按键的状态是按下,
  2. 如果最高位是0,说明按键的状态是抬起;
  3. 如果最低位被置为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;
}

注意;

  • 在使用该函数时,一般会涉及 按位或(|)、按位与(&) 等等。
  • 参考虚拟键值表

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值