Win32 API

 

个人主页:星纭-CSDN博客

系列文章专栏 : C语言

踏上取经路,比抵达灵山更重要!一起努力一起进步!

一.Win32 API

1.Win32 API介绍

Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application),所以便 称之为Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows  32位平台的应⽤程序编程接⼝。Win32 API(Windows API)是一组用于开发Windows应用程序的编程接口。它提供了许多功能,包括图形界面、文件和设备操作、网络通信、多媒体处理等。Win32 API是基于C语言的,开发者可以使用C或C++来编写应用程序。

2.控制台程序 

平常我们运行程序出来的那个黑框程序就是控制台程序 

有些读者的电脑,可能运行程序得到是这样的:

读者可以按照如图所示的操作将其进行更改。 

然后关闭重新运行程序。 就可以得到以下效果。

这样的控制我们是可以对其进行许多的操作的。

我们可以使用cmd命令来设置控制台窗口的大小。参考:mode

     system("mode con cols=100 lines=30");

第一个参数con指的是命令提示符窗口,第二个就是列,第三个就是行。我们可以将这个更改为我们自己想要的值。

如果你觉得窗口最左上角的内容不想要,也可以进行更改。通过命令设置控制台窗口的名字。

    system("title 贪吃蛇");

#include<windows.h>
int main()
{
	system("mode con cols=100 lines=30");
	system("title 贪吃蛇");
}

使用system函数 是需要包含头文件windows.h的。

如果读者自行尝试运行以上的代码,会发现,控制台窗口的名字,并没有更改成我们想要的样子。

这是为什么呢?

因为运行完以上代码后,程序就结束了,它就变成了之前的名字。

如果我们再加上一行代码就可以看到想要更改的名字了。

此时的程序会停止下来,如果我们随便按一个键,此时程序就会继续运行,当程序结束后名字又会变回去。

参考:title 

3.控制台程序上的坐标COORD 

 COORD是windows API中定义的一个结构体,定义控制台屏幕缓冲区中字符单元的坐标。 坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。

COORD类型的声明

typedef struct _COORD{
    SHORT X;
    SHORT Y;
}COORD,*PCOORD;

给坐标赋值:

COORD pos = { 10,15 };

 4.GetStdHandle函数

GetStdHandle函数是一个windowsAPI函数,它用于从一个特定的标准设备(标准输入,标准输出或者标准错误)中获得一个句柄(来表示不同的设备的数值),使用这个句柄可以操作设备。

	//获得标准输出设备的句柄(来标识不同的设备)
	HANDLE houtput = NULL;
	houtput = GetStdHandle(STD_OUTPUT_HANDLE);

这个函数的返回值是一个HANDLE类型的值。

5.GetConsoleCursorInfo 函数 

 GetConsoleCursorInfo 函数可以用于对得到有关指定控制台屏幕缓冲区的光标的大小和可以信息。

 对于这个光标来说,此时的光标是只有25%的,并且可见的,我们可以通过更改光标信息,让其占据满整个字符,或者不可见。

BOOL WINAPI GetConsoleCursorInfo(
    HANDLE hConsoleOutput,
    PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);

 PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标。

第一个参数是控制台的句柄,第二个参数是类型是控制光标信息的一个变量的指针。

调用这个函数会把控制台光标的信息存放在第二个参数所指向的变量中。

6.CONSOLE_CURSOR_INFO

这个结构体,包含了控制台光标的信息

typedef struct _CONSOLE_CURSOR_INFO {
  DWORD dwSize;
  BOOL  bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

第一个成员变量是控制光标填充字符单元的百分比大小,比如开始的时候,填充大概是25.

第二个成员变量就是控制光标是否可见,如果我们想完成一个游戏,当这个光标一直在屏幕上一闪一闪,难免影响游戏体验,这时候就可以将其设置为不可见。

7.SetConsoleCursorInfo 函数 

SetConsoleCursorInfo 函数可以为指定的控制台屏幕缓冲区设置光标的大小和可见性。

第一个参数句柄,第二个参数是控制台信息。

8.修改光标

学习了上面的知识点,我们就可以尝试按照自己的想法更改光标了。

//}
int main()
{
	//获得标准输出设备的句柄
	HANDLE houtput = NULL;
	houtput = GetStdHandle(STD_OUTPUT_HANDLE);

	//定义一个光标信息的结构体
	CONSOLE_CURSOR_INFO cursor_info = {0};

	//获取和houput句柄相关的控制台上的光标的信息,存放在cursor_info中
	GetConsoleCursorInfo(houtput,&cursor_info);
	
	//修改光标信息
	cursor_info.dwSize = 100;//占比
	cursor_info.bVisible = false;//可见度

	//设置和houtput句柄相关的控制台上的光标的信息
	SetConsoleCursorInfo(houtput, &cursor_info);

	printf("光标占比  :%d\n",cursor_info.dwSize);
	printf("光标可见度:%d\n",cursor_info.bVisible);
	system("pause");
	return 0;
}

讲解上面的代码:

 HANDLE houtput是一个变量。通过这个函数GetStdHandle(STD_OUTPUT_HANDLE)从标准输出设备中得到有关其的句柄。返回值用houtput这个接收,这样我们就可以通过这个变量来控制标准输出设备。

CONSOLE_CURSOR_INFO cursor_info这是一个有关控制台光标信息的一个结构体。

 GetConsoleCursorInfo(houtput,&cursor_info);从句柄中得到有关光标的信息,并且存放在上面的结构体中。

然后就可以通过这个结构体更改光标信息,但是实际上,电脑中的这个光标信息是没有变化的,这个结构体只不过是一个光标信息的复制品。

SetConsoleCursorInfo(houtput, &cursor_info);这个函数就根据这个结构体中存储的光标信息,对真正的光标信息,进行更改。

最后打印出这个光标信息。

9.SetConsoleCursorPosition函数

语法:

BOOL WINAPI SetConsoleCursorPosition(
  _In_ HANDLE hConsoleOutput,
  _In_ COORD  dwCursorPosition
);

设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的变量中,调用该函数将光标位置移动到指定的位置。

	//获得标准输出设备的句柄
	HANDLE houtput = NULL;
	houtput = GetStdHandle(STD_OUTPUT_HANDLE);

	COORD pos = {10, 5};
	SetConsoleCursorPosition(houtput, pos);

	Sleep(10000);

可以观察到光标的位置在10,5的位置。

为了方便,我们可以单独封装一个函数来设置光标的位置。

10.getAsyncKeyState 函数

SHORT GetAsyncKeyState(
    int vKey
);

这个函数将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果 返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬 起;如果最低位被置为1则说明,该按键被按过,否则为0。 如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1

#define KEY_PRESS(vk) ((GetAsyncKeyState(vk) & 1) ? 1 : 0)

通过按位与操作符就可以判断最地位是否为1.

虚拟键码:虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn

也可以通过这个返回值是否小于0来判断这个键有没有被按下。

#define KEY_PRESS_sustained(vk) ((GetAsyncKeyState(vk) < 0) ? 1 : 0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644456.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【达梦系列】IFUN_DATETIME_MODE 导致【无效的客户端版本】

问题描述 在项目开发时&#xff0c;应用程序连接达梦数据库报错&#xff1a;无效的客户端版本。这个问题在没有调整达梦数据参数之前是正常的&#xff0c;调整之后就不对了&#xff0c;但是又不清楚到底是哪个参数的问题。因为调整达梦参数时&#xff0c;用了一个达梦的参数调…

python数据分析——字符串和文本数据2

参考资料&#xff1a;活用pandas库 1、字符串格式化 &#xff08;1&#xff09;格式化字符串 要格式化字符串&#xff0c;需要编写一个带有特殊占位符的字符串&#xff0c;并在字符串上调用format方法向占位符插入值。 # 案例1 varflesh wound s"Its just a {}" p…

求斐波那契数列第n项的值

本期介绍&#x1f356; 主要介绍&#xff1a;什么是斐波那契数列&#xff0c;递归实现求斐波那契数列第n项值&#xff0c;递归法为什么不适合求斐波那契数&#xff0c;用迭代法实现求斐波那契数列的值&#x1f440;。 文章目录 1. 斐波那契数列是什么&#xff1f;2. 题目2. 递归…

Java开发大厂面试第26讲:生产环境如何排查问题和优化 JVM?

通过前面几个课时的学习&#xff0c;相信你对 JVM 的理论及实践等相关知识有了一个大体的印象。而本课时将重点讲解 JVM 的排查与优化&#xff0c;这样就会对 JVM 的知识点有一个完整的认识&#xff0c;从而可以更好地应用于实际工作或者面试了。 我们本课时的面试题是&#x…

【气象常用】间断时间序列图

效果图&#xff1a; 主要步骤&#xff1a; 1. 数据准备&#xff1a;随机数组 2. 图像绘制&#xff1a;绘制间断的时间序列 详细代码&#xff1a;着急的直接拖到最后有完整代码 步骤一&#xff1a;导入库包及图片存储路径并设置中文字体为宋体&#xff0c;西文为新罗马&…

Foxit PDF Editor Pro福昕PDF编辑器Pro:重塑您的文档编辑体验

在信息爆炸的时代&#xff0c;PDF文件因其跨平台、格式稳定等特性&#xff0c;成为我们日常工作与学习中不可或缺的一部分。然而&#xff0c;面对这些文件时&#xff0c;许多人都会遇到一个共同的难题&#xff1a;如何高效、专业地编辑PDF内容&#xff1f;今天&#xff0c;我要…

企业内网开源OA服务器(办公自动化系统),搭建O2OA基于Linux(openEuler、CentOS8)

本实验环境为openEuler系统(以server方式安装)&#xff08;CentOS8基本一致&#xff0c;可参考本文) 目录 知识点实验下载安装O2OA安装mysql配置O2OA 知识点 “O2OA” 是一个开源的、基于Java的办公自动化&#xff08;Office Automation&#xff09;系统。其名称中的“O2OA”…

CnosDB:深入理解时序数据质量函数

在CnosDB中&#xff0c;我们设计并实现了计算数据质量的多个指标&#xff0c;这些指标可以从多个维度评估时序数据的质量&#xff0c;对于时间戳列&#xff0c;我们考虑数据的缺失点、冗余点和延迟点。对于值列&#xff0c;我们考虑数据的异常值、范围、变化、速度和加速度。 C…

【对角线遍历】python

没啥思路 class Solution:def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:mlen(mat)nlen(mat[0])ret[]if len(mat)0:return retcount0#mn-1是对角线总数while count<mn-1:#x和y的和刚好是count数#偶数为右上走if count%20:xcount if(count<m)else (…

(二十一)【Jmeter】定时器作用域

简述 由于在性能测试中,要模拟用户操作时间差,需要设置操作之间的等待时间,Jmeter中有定时器,那么在使用定时器之前,需要了解定时器的工作原理,是否符合我们业务场景的执行要求? 该文主要讲解Jmeter中定时器作用范围,本次文主要使用两种简单模型来进行说明,可以基于这…

Java进阶学习笔记14——模板方法设计模式

面试和看源码。 谈到设计模式&#xff1a; 1、解决了什么问题&#xff1f; 2、怎么写&#xff1f; 模板方法设计模式解决了什么问题&#xff1f; 解决方法中存在重复代码的问题。 写法&#xff1a; 1&#xff09;定义一个抽象类&#xff1a; 2&#xff09;在里面定义两个方…

【限免】短时傅里叶变换时频分析【附MATLAB代码】

来源&#xff1a;微信公众号&#xff1a;EW Frontier 简介 一种能够同时对信号时域和频域分析的方法——短时傅里叶变换&#xff08;STFT&#xff09;&#xff0c;可以在时频二维角度准确地描述信号 的时间、频域的局部特性&#xff0c;与其他算法不同&#xff0c;通过该算法可…

类和对象【六】友元和内部类

文章目录 友元友元的作用友元的缺点友元函数语法&#xff1a;特点&#xff1a; 友元类语法&#xff1a;特点&#xff1a; 内部类概念特点 友元 友元的作用 友元提供了一种打破封装的方式&#xff0c;有时提供了便利。 友元的主要作用就是打破封装 即可以让一个类的友元函数…

Hive(28): CLIs and Commands客户端和命令

1 Hive CLI $HIVE_HOME/bin/hive是一个shellUtil,通常称之为hive的第一代客户端或者旧客户端,主要功能有两个: 用于以交互式或批处理模式运行Hive查询,注意,此时作为客户端,需要并且能够访问的是Hive metastore服务,而不是hiveserver2服务。用于hive相关服务的启动,比如…

Slash后台管理系统代码阅读笔记 如何实现环形统计图表卡片?

目前&#xff0c;工作台界面的上半部分已经基本梳理完毕了。 接下来&#xff0c;我们看看这个环形图卡片是怎么实现的&#xff1f; 具体代码如下&#xff1a; {/*图表卡片*/} <Row gutter{[16, 16]} className"mt-4" justify"center">{/*环形图表…

海外链游地铁跑酷全自动搬砖挂机掘金变现项目,号称单窗口一天收益30+(教程+工具)

一、项目概述 地铁跑酷海外版国外版自动搬砖挂机掘金项目是一款结合了地铁跑酷元素的在线游戏&#xff0c;为玩家提供一个全新的游戏体验&#xff0c;使得玩家可以轻松地进行游戏&#xff0c;无需手动操作&#xff0c;节省时间和精力。 二、游戏特点 1. 自动化操作&#xff1…

春秋云境CVE-2018-20604

简介 雷风影视CMS是一款采用PHP基于THINKPHP3.2.3框架开发&#xff0c;适合各类视频、影视网站的影视内容管理程序&#xff0c;该CMS存在缺陷&#xff0c;可以通过 admin.php?s/Template/edit/path/*web*..*..*..*..*1.txt 的方式读取任意文件。 正文 1.进入靶场 2./admin…

设计模式之创建型模式---原型模式(ProtoType)

文章目录 概述类图原型模式优缺点优点缺点 代码实现 概述 在有些系统中&#xff0c;往往会存在大量相同或者是相似的对象&#xff0c;比如一个围棋或者象棋程序中的旗子&#xff0c;这些旗子外形都差不多&#xff0c;只是演示或者是上面刻的内容不一样&#xff0c;若此时使用传…

酷开科技以内容为契机,酷开系统向消费者需求的深度挖掘迈进一步

酷开系统还拥有强大的内容资源和推荐算法&#xff0c;能够根据消费者的兴趣爱好为其提供个性化的推荐服务。无论是电影、电视剧、综艺节目&#xff0c;还是新闻、体育、娱乐资讯&#xff0c;酷开系统都能帮助大家快速找到感兴趣的内容&#xff0c;并且通过智能推荐算法不断优化…

Java | Leetcode Java题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution {public boolean hasPathSum(TreeNode root, int sum) {if (root null) {return false;}if (root.left null && root.right null) {return sum root.val;}return hasPathSum(root.left, sum - root.val) || has…