首页 > 其他分享 >Win32 API 及其部分函数

Win32 API 及其部分函数

时间:2024-07-19 14:26:09浏览次数:13  
标签:houtput HANDLE 函数 COORD Win32 API PRESS 控制台 光标

 

目录

一,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;
}

注意;

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

标签:houtput,HANDLE,函数,COORD,Win32,API,PRESS,控制台,光标
From: https://blog.csdn.net/2301_80001281/article/details/140522965

相关文章

  • EeayDecode:解码合约的自定义错误、事件和函数参数与返回值
    官网:easydecode.dev还在为解码合约自定义错误事件和函数参数与返回值而苦恼吗?快试试easydecode吧!只需提供合约ABI即可快速、方便的解码合约的自定义错误、事件和函数参数与返回值。1.解码Event将Event的Topics(字符串数组,使用,分割)和Data填入输入框,点击“DecodeE......
  • FastAPI登录实现(JWT)
    JWT(JSON Web Tokens)一、依赖库安装jwtpipinstalljwt==1.2.0python-jose用于生成和检验JWT令牌pipinstallpython-jose==3.2.0passlib用于处理哈希密码的包支持许多安全哈希算法以及配合算法使用的实用程序推荐的算法是 Bcryptpipinstallpasslib[Bcrypt]==1.7......
  • ucosiii(1): 时钟节拍函数
    时钟节拍中断调用OSTimeTick()函数voidOSTimeTick(void){if(OSRunning!=OS_STATE_OS_RUNNING){return;}>OSTimeTickHook();/*Calluserdefinablehook*/#if(OS_CF......
  • python之初识函数(函数的使用、可变长度参数*args和**kwargs、return的作用),了解函数的
    文章目录前言1、函数1.1函数的本质1.2定义函数1.3调用函数1.4深入解析函数1.5定义函数的完整语法1.5.1参数1.5.1.1参数的分类(位置、默认、关键字、可变长度)1.5.1.2参数的书写顺序1.5.2关键字:return前言本篇文章的目的是带领大家从零开始认识函数,作为函数......
  • C++(指针函数、函数指针)
    目录1.指针函数2.函数指针3.区别总结在C++中,指针函数和函数指针是两个不同的概念,尽管它们的名字非常相似。以下是详细的介绍和区别:1.指针函数指针函数(Pointertoafunction)是返回类型为指针的函数。它的返回值是一个指向某种数据类型的指针。以下是一个示例:int*get......
  • PHP 调用 JD 详情 API 接口:数据获取新途径
    在当今数字化的商业环境中,准确和及时的数据对于企业的决策和运营至关重要。京东(JD)作为国内知名的电商平台,其商品详情数据具有极高的价值。通过使用PHP调用JD详情API接口,为我们开辟了一条全新的数据获取途径。一、JD详情API接口简介JD详情API接口提供了丰富的商......
  • 利用 PHP 获取淘宝详情 API 接口的实战技巧
    在电商领域的开发中,获取淘宝商品详情数据是一项关键任务。通过PHP来调用淘宝详情API接口,可以为我们的应用增添丰富的功能和价值。以下将分享一些实战技巧,帮助您更高效地实现这一目标。一、前期准备工作注册淘宝开放平台账号并申请API权限:确保您具备合法的访问权限。......
  • C++ 函数重载注意事项
    C++中的函数重载(FunctionOverloading)是一种允许同一作用域内存在多个同名函数,但是这些函数的参数列表(参数的类型、个数或顺序)必须不同。这使得函数可以根据传入参数的不同而执行不同的任务。然而,在使用函数重载时,需要注意以下几个重要事项:参数列表必须不同:函数的参数个数、......
  • Python 文件操作与管理:Open函数、Json与Pickle、Os模块
    1.open函数的使用Python中的open()函数是处理文件的标准方法。它允许你打开一个文件,并对其进行读取、写入或追加操作open(file,mode,encoding)函数的格式:file:文件路径mode:打开方式(读:r写:w读完之后光标停留在最后读取的位置......
  • 如何用JS实现sleep函数?分享1段优质JS代码片段!
    Hi,这里是前端后花园,每天学习一个JS片段,涨涨知识......