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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis内存回收-内存淘汰策略

LFU的访问次数之所以叫做逻辑访问次数&#xff0c;是因为并不是每次key被访问都计数&#xff0c;而是通过运算&#xff1a; 生成0~1之间的随机数R计算 (旧次数 * lfu_log_factor 1)&#xff0c;记录为P如果 R < P &#xff0c;则计数器 1&#xff0c;且最大不超过255访问…

9.任务调度

一、开启任务调度器 1.函数 vTaskStartScheduler() 函数 vTaskStartScheduler()用于启动任务调度器&#xff0c;任务调度器启动后&#xff0c;FreeRTOS 便会开始 进行任务调度&#xff0c;除非调用函数 xTaskEndScheduler()停止任务调度器&#xff0c;否则不会再返回。函数 vTa…

Centos修改系統語言

一、使用命令行修系统语言 1、显示系统当前语言环 [rootkvm-suma ~]# localectl System Locale: LANGen_US.utf8 VC Keymap: cn X11 Layout: cn 2、查看系统支持字符集 [rootkvm-suma ~]# locale -a 2、设置系统语言环境 [rootkvm-suma ~]# localectl set-locale LANGz…

【GESP试卷】2024年03月Scratch四级试卷

2024年GESP03月认证Scratch四级试卷 分数&#xff1a;100 题数&#xff1a;27 一、单选题(共15题&#xff0c;每题2分&#xff0c;共30分) 010203040506070809101112131415CDBBACBCDCDADBA 1、小杨的父母最近刚刚给他买了一块华为手表&#xff0c;他说手表上跑的是鸿蒙&…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充 插件IDEAVsCode MavenvagrantDocker解决MySQL连接慢问题启动&#xff08;自动&#xff09;Docker注意切换到root用户远程访问MySQL MyBatisPlus代码地址参考 插件 IDEA Mybati…

【数据挖掘】四分位数识别数据中的异常值(附代码)

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

STM32F1之OV7725摄像头

目录 1. 摄像头简介 2. OV7725 摄像头简介 3. OV7725 引脚 4. OV7725 功能框架图 5. SCCB时序 5.1 SCCB 的起始、停止信号及数据有效性 5.2 SCCB 数据读写过程 1. 摄像头简介 在各类信息中&#xff0c;图像含有最丰富的信息&#xff0c;作为机…

SVM原问题与对偶问题

目的&#xff1a;求出我们的f(X)&#xff0c;它代表着我们X映射到多维的情况&#xff0c;能够帮我们在多维中招到超平面进行分类。 1.优化问题&#xff1a; 1.1推荐好书&#xff1a; 1.2 优化理论中的原问题&#xff1a; 原问题和限制条件如下&#xff1a; 这是一个泛化性…

【漏洞复现】英飞达医学影像存档与通信系统 WebJobUpload 任意文件上传漏洞

0x01 产品简介 英飞达医学影像存档与通信系统 Picture Archiving and Communicaton System&#xff0c;它是应用在医院影像科室的系统&#xff0c;主要的任务就是把日常产生的各种医学影像(包括核磁&#xff0c;CT&#xff0c;超声&#xff0c;各种X光机&#xff0c;各种红外仪…

LeetCode - 数组 - 四数之和

题目地址 描述 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#x…

cs与msf权限传递以及mimikatz抓取win2012明文密码

简单的介绍 cs与msf的简单介绍 我查找过资料得出&#xff0c;Cobalt Strike 的前身是 Armitage&#xff0c;而 Armitage 又可以理解为 Metasploit Framework 的图形界面版&#xff0c;因此 Cobalt Strike 与 Metasploit Framework 在很多地方都是兼容的&#xff0c;所以我们便…

人工智能 框架 paddlepaddle 飞桨 使用指南 使用例子 线性回归模型demo 详解

安装过程&使用指南&线性回归模型 使用例子 本来预想 是安装 到 conda 版本的 11.7的 但是电脑没有gpu 所以 安装过程稍有变动,下面简单讲下 conda create -n paddle_env117 python=3.9 由于想安装11.7版本 py 是3.9 所以虚拟环境名称也是 paddle_env117 activa…

下载和安装AD19 - Altium Designer 19.1.9 Build 167

虽然有AD24 的安装资源&#xff0c;但是我比较喜欢19 这个数字[doge] 下载 仍然是从毛子网站源头进货&#xff1a;https://rutracker.net/forum/viewtopic.php?t5754276&#xff0c;网盘: https://pan.baidu.com/s/1ic31N4h7HS2FBu7JFll0YQ?pwdvjum 提取码: vjum 安装 压…

【DevOps】深入了解RabbitMQ:AMQP协议基础、消息队列工作原理和应用场景

目录 一、核心功能 二、优势 三、核心概念 四、工作原理 五、交换机类型 六、消息确认 七、持久性和可靠性 八、插件和扩展 九、集群和镜像队列 十、客户端库 十一、管理界面 十二、应用场景 RabbitMQ是一个基于AMQP协议的消息队列中间件&#xff0c;提供高可用、可…

[MRCTF2020]Xor

32位程序 主要逻辑 flagMSAWB~FXZ:J:tQJ"N bpdd}8g for i in range(len(flag)):print(chr(ord(flag[i])^i),end)

react 权限树形结构实现

项目背景 react ant design 实现效果 1 将后台返回的平铺数据 , 转成树形结构 const [roleId, setRoleId] useState() //存储角色id// 弹权限弹窗const empowerHandle async record > {setRoleId(record.roleId)//获取单独的权限const res1 await getPermission({ role…

力扣96. 不同的二叉搜索树

Problem: 96. 不同的二叉搜索树 文章目录 题目描述思路复杂度Code 题目描述 思路 一个数字做根节点的话可能的结果为&#xff1a;其左边数字做子树的组合数字乘以其右边数字做子树的个数之积 1.创建备忘录memo&#xff1b; 2.递归分别求取当前数字左边和右边数字做子树的数量&…

Vue 中 diff 算法原理

1. Diff 概念 vue 基于虚拟 DOM 做更新 。diff 的核心就是比较两个虚拟节点的差异 。Vue 的 diff 算法是平级比较,不考虑跨级比较的情况。内部采用深度递归的方式 + 双指针的方式进行比较。 2. Vue2 Diff 比较流程. 1.1先比较是否是相同节点 key tag 1.2相同节点比较属性,并…

【数据结构与算法 刷题系列】移除链表元素

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;数据结构与算法刷题系列&#xff08;C语言&#xff09; 期待您的关注 目录 一、问题描述 二、解题思路 三、源代码实现 一、问题…