常用Win32 API的简单介绍

目录

前言:

控制控制台程序窗口的指令:

system函数:

COORD函数:

GetStdHandle函数:

GetConsoleCursorInfo函数:

CONSOLE_CURSOR_INFO函数:

SetConsoleCursorInfo函数:

SetConsoleCursorPosition函数:

GetAsyncKeyState函数:

 实例:监控部分键盘按键的使用

小拓展:


前言:

        Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程式达到开启视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应⽤程序编程接⼝。

本篇介绍的API主要针对下一篇贪吃蛇项目中用到的API

控制控制台程序窗口的指令:

        平常我们win+R输入cmd后运⾏起来的⿊框程序其实就是控制台程序,我们可以通过一些命令实现对控制台程序实现一些简单的更改:
//更改窗⼝的⻓宽
mode con cols= 100 lines= 30
//更改窗⼝的名字
title 改名字
那么我们该怎样在VS2022编译环境下使用这些命令呢?

system函数:

函数原型:int system(const char *command);

command表示要执行的命令,该命令将由操作系统的控制台程序进行分析和执行

包含头文件:<stdlib.h>

作用:在编译器环境下实现对操作系统的控制台程序的相关操作

(先了解,具体使用会在后续的贪吃蛇项目中实现)


COORD函数:

函数原型:

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

包含头文件:<windows.h>

作用:表示⼀个字符在控制台屏幕上的坐标

//给结构体类型的变量pos赋值:
COORD pos = { 10 , 15 }; //这的确是给结构体类型变量赋值的正确方式哈

GetStdHandle函数:

函数原型:HANDLE GetStdHandle(DWORD nStdHandle);

包含头文件:<windows.h>

作用:从⼀个特定的标准设备中获取(标准输⼊、标准输出或标准错误)中取得⼀个句柄,有了该句柄就有了对该设备输入、输出或错误进行修改的权限

①HANDLE是一个结构体类型的指针

DWORD nStdHandle用于指定要获取的标准设备的类型,常用的标准设备类型包括:

        STD_INPUT_HANDLE:标准输入设备

        STD_OUTPUT_HANDLE:标准输出设备

        STD_ERROR_HANDLE:标准错误设备

③函数的返回值是一个句柄,有了它你就获取了对于以上三种设备的操作权限,至于获取权限后可以干什么就得看你的需求了,我们在下面获得了控制台程序的标准输出设备的权限后可以利用GetConsoleCursorInfo函数对光标信息进行控制

一旦你获得了某个标准设备的权限,就可以根据个人需求选择适当的函数或方法来执行一些操作

有了某个权限后只能用来执行它这个权限规定范围内的操作 

(比如我允许你在我电脑上玩游戏之类的但你不能更改我电脑的相关配置,我没给你这个权限) 

如果你还不懂,往下看后面有对该函数的使用案例

// 获取标准输出的句柄hOutput(有了它你就有了操作修改台光标信息等的权限)
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleCursorInfo函数:

函数原型:
BOOL  WINAPI  GetConsoleCursorInfo {
HANDLE hConsoleOutput ,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
};
包含头文件:<windows.h>
作用:利用获取的控制台输出句柄hConsoleOutput来控制光标lpConsoleCursorInfo:指向CONSOLE_CURSOR_INFO结构体的指针,用于接收光标的信息)(想要控制还得用下面这个函数)

CONSOLE_CURSOR_INFO函数:

函数原型:

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

包含头文件:<windows.h>

作用:控制光标的大小dwise(取值范围为1到100之间的百分比)和是否可见vVisible (TRUE表示可见,FALSE表示不可见,默认可见)


//GetConsoleCursorInfo函数需要与CONSOLE_CURSOR_INFO函数配合使用:
hOutput = GetStdHandle (STD_OUTPUT_HANDLE);  //获得标准输出设备的句柄
CONSOLE_CURSOR_INFO CursorInfo;          //定义结构体类型变量     
GetConsoleCursorInfo (hOutput, &CursorInfo); //获取当前光标信息(让系统知道)
CursorInfo.dwSize=50; //然后才能利用CursorInfo修改光标信息

SetConsoleCursorInfo函数:

函数原型:
BOOL WINAPI SetConsoleCursorInfo {
HANDLE hConsoleOutput ,
const CONSOLE_CURSOR_INFO * lpConsoleCursorInfo
};
包含头文件:<windows.h>
作用:显示修改后的光标信息
!!!这里是上面四个函数的整体配合方式:
//操作光标的全部流程
HANDLE hOutput = GetStdHandle (STD_OUTPUT_HANDLE); //获取权限
CONSOLE_CURSOR_INFO CursorInfo; //定义结构体类型变量
GetConsoleCursorInfo (hOutput, &CursorInfo); // 获取控制台光标信息
CursorInfo.bVisible = false ; // 隐藏控制台光标
SetConsoleCursorInfo (hOutput, &CursorInfo); // 设置控制台光标状态

SetConsoleCursorPosition函数:

函数原型:
BOOL WINAPI SetConsoleCursorPosition {
HANDLE hConsoleOutput ,
COORD pos
};

包含头文件:<windows.h>

作用:将光标位置设置到指定的位置

COORD pos = { 10 , 5 };
// 获取标准输出的句柄
HANDLE hOutput = GetStdHandle (STD_OUTPUT_HANDLE);
// 设置标准输出上光标的位置为 pos
SetConsoleCursorPosition (hOutput, pos);
为了便于设置光标的位置我们会 自定义 一个 SetPos函数 ,它的使用方式如下
// 设置光标的坐标
void SetPos ( short x, short y)
{
COORD pos = { x, y };
// 获取标准输出的句柄 ( ⽤来标识不同设备的数值 )
HANDLE hOutput = GetStdHandle (STD_OUTPUT_HANDLE);
// 设置标准输出上光标的位置为 pos
SetConsoleCursorPosition (hOutput, pos);
}
#include <stdio.h>
#include <windows.h>
#include <stdbool.h> 
int main()
{HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//获取权限COORD pos = { 5,20 };SetConsoleCursorPosition(hOutput, pos);int ch = getchar();putchar(ch);return 0;
}

可以看到初始输入(初始光标)的坐标已经从x=0,y=0变为了x=5,y=20... 


GetAsyncKeyState函数:

函数原型:
SHORT GetAsyncKeyState (
int vKey
);
包含头文件:<windows.h>
作用:监控按键使用(按下/弹起)情况
详细作用:GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果 返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0
//如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1
# define KEY_PRESS(VK)  ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )

 实例:监控部分键盘按键的使用

#include <stdio.h>
#include <windows.h>
//PRESS_KET 来检测vk这些虚拟键值对应的按键是否被按过
//如果按过返回1,未按过返回0
#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;
}

        注意这里只能对主键盘(有字母的那个)中的数字按键进行监控,对于小键盘中的数字键,该函数并不能直接检测到其按下

小拓展:

        小键盘中的数字键实际上是通过发送键盘消息的方式来模拟的,而不是直接映射为键盘扫描码。因此,GetAsyncKeyState() 函数无法直接检测小键盘中的数字键,如果你想要检测小键盘中的数字键是否被按下,可以使用以下方法之一:

        使用 GetKeyState() 函数:GetKeyState() 函数可以检测指定虚拟键的状态,包括小键盘中的数字键。你可以传递小键盘数字键对应的虚拟键码(如 VK_NUMPAD0VK_NUMPAD1 等)作为参数,然后检查返回值的最高位是否被设置(表示按键被按下)。

#include <stdio.h>
#include <windows.h>
//PRESS_KET 来检测vk这些虚拟键值对应的按键是否被按过
//如果按过返回1,未按过返回0
#define KEY_PRES(VK) ((GetKeyState(VK) & 0x8000) ? 1 : 0)
int main()
{while (1){if (KEY_PRESS(0x60)){printf("0\n");}else if (KEY_PRESS(0x61)){printf("1\n");}else if (KEY_PRESS(0x62)){printf("2\n");}else if (KEY_PRESS(0x63)){printf("3\n");}else if (KEY_PRESS(0x64)){printf("4\n");}else if (KEY_PRESS(0x65)){printf("5\n");}else if (KEY_PRESS(0x66)){printf("6\n");}else if (KEY_PRESS(0x67)){printf("7\n");}else if (KEY_PRESS(0x68)){printf("8\n");}else if (KEY_PRESS(0x69)){printf("9\n");}}return 0;
}

~over~ 

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

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

相关文章

解决“您点击的链接已过期”;The Link You Followed Has Expired的问题

今天WP碰到一个坑。无论发布文章还是更新插件、更换主题都是这么一种状态“您点击的链接已过期”&#xff1b;The Link You Followed Has Expired 百度出来的答案都是修改post_max_size 方法1. 通过functions.php文件修复 这种方法更容易&#xff0c;只需将以下代码添加到Wor…

maven仓库改国内源

今天准备复现漏洞环境&#xff0c;发现太慢&#xff0c;需要配置国内源 file -> settings 搜索maven 修改settings.xml&#xff0c;这里的需要修改两个文件 1.上图的settings.xml文件 2.idea的maven模块 settings.xml文件将原来的注释掉&#xff0c;然后把阿里的添加上&…

Web前端—Flex布局:标准流、浮动、Flex布局、综合案例(短视频首页解决方案)

版本说明 当前版本号[20231024]。 20231024初版 目录 文章目录 版本说明目录Flex布局01-标准流02-浮动基本使用产品区域布局HTML标签CSS样式 清除浮动场景搭建额外标签法单伪元素法双伪元素法overfow法 03-Flex布局Flex组成主轴对齐方式侧轴对齐方式修改主轴方向弹性伸缩比弹…

第3章 指令级并行及其利用

3.1 指令级并行&#xff1a;概念和挑战 1985年之后几乎所有处理器都使用流水线来使指令能重叠执行。由于指令可以并行执行&#xff0c;所有指令之间的这种可能得重叠称为指令级并行ILP。 ILP大体有两种实现方法&#xff1a; 1. 依靠硬件来动态发现并实现并行&#xf…

基于C语言 --- 自己写一个通讯录

C语言程序设计笔记---039 C语言之实现通讯录1、介绍C/C程序的内存开辟2、C语言实现通讯录2.1、ContactMain.c程序大纲2.2、Contact2.h2.3、Contact2.c2.3.1 InitContact( )初始化通讯录函数2.3.2 AddContact( )添加联系人和CheckCapaticy( )检查容量函数2.3.3、ShowContact( )显…

常用Web安全扫描工具汇整

漏洞扫描是一种安全检测行为&#xff0c;更是一类重要的网络安全技术&#xff0c;它能够有效提高网络的安全性&#xff0c;而且漏洞扫描属于主动的防范措施&#xff0c;可以很好地避免黑客攻击行为&#xff0c;做到防患于未然。 1、AWVS Acunetix Web Vulnerability Scanner&a…

图书推荐管理系统Python+Django网页界面+协同过滤推荐算法

一、介绍 图书管理与推荐系统。使用Python作为主要开发语言。前端采用HTML、CSS、BootStrap等技术搭建界面结构&#xff0c;后端采用Django作为逻辑处理&#xff0c;通过Ajax等技术实现数据交互通信。在图书推荐方面使用经典的协同过滤算法作为推荐算法模块。主要功能有&#…

安全、高效远程访问大数据分析平台解决方法:Splunk Enterprise+Cpolar

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 Splunk Enterprise是一个强大的机器数据管理平台&#xff0c;可帮助客户分析和搜索数据&#xff0c;以及可视化数据…

iPhone开发--Xcode15下载iOS 17.0.1 Simulator Runtime失败解决方案

爆句粗口&#xff0c;升级后公司网络下载iOS 17.0.1 Simulator Runtime一直出错&#xff0c;每次出错后都得重新开始下载&#xff0c;oh&#xff0c;f**k。上一次在在家里的网络升级成功。 解决办法一&#xff1a; 进入网址&#xff1a;https://developer.apple.com/download…

税务某局 webpack 登录接口逆向分析

持续创作文章&#xff0c;只是为了更好的思考 这里不多介绍了&#xff0c;我放一张图大家就明白是什么接口了。这里只介绍整体加密逻辑&#xff0c;有些细的地方大家自行调整。 本次逆向的网址是 aHR0cHM6Ly90cGFzcy5qaWxpbi5jaGluYXRheC5nb3YuY246ODQ0My8jL2xvZ2luP3JlZGly…

FPGA的256点FFT调用Quartus IP核实现VHDL傅里叶变换

名称&#xff1a;256点FFT调用Quartus IP核实现傅里叶变换 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a;使用VHDL实现256点FFT&#xff0c;调用Quartus IP核实现傅里叶变换 演示视频&#xff1a;http://www.hdlcode.com/index.php?mhome&cView…

笔记39:在Pycharm中为项目添加新解释器

很久不用pycharm都生疏了 a a a 第一步&#xff1a;创建虚拟环境 略 a a a 第二步&#xff1a;将虚拟环境应用到项目中去 【File】----【Settings】----【Project:~~~】-----【Project Interpreter】----【选择合适的解释器】 ​​​​​​​ 因为我们要用新的解释…

【API篇】七、Flink窗口

文章目录 1、窗口2、分类3、窗口API概览4、窗口分配器 在批处理统计中&#xff0c;可以等待一批数据都到齐后&#xff0c;统一处理。但是在无界流的实时处理统计中&#xff0c;是来一条就得处理一条&#xff0c;那么如何统计最近一段时间内的数据呢&#xff1f; ⇒ 窗口的概念&…

虚幻引擎:代理

一、代理类型 1.单薄代理 特点&#xff1a;允许有返回值&#xff0c;允许有参数&#xff0c;只可以一对一的传递消息就算绑定多个&#xff0c;但是总会被最后一个覆盖 2.多播代理 特点&#xff1a;不允许有返回值&#xff0c;允许有参数允许一对多传递消息 3.动态代理 …

js关于深度克隆问题

js的克隆是一个老生常谈的内容了,今天没啥好写的,就写这个了 要搞清楚js的克隆,就需要先搞清楚js中的数据类型,js中数据类型分为两大类 类型说明原始类型-string字符串类型&#xff0c;用于表示文本数据。number数字类型&#xff0c;包括整数和浮点数&#xff0c;用于表示数值…

app拉新渠道整合 一手地推、网推拉新平台整理

1.聚量推客 聚量推客自己本身是服务商&#xff0c;自己直营的平台&#xff0c;相对来说数据更好&#xff0c;我们也拿到了平台首码&#xff1a;000000 填这个就行&#xff0c;属于官方渠道 2.蓝猫推客 蓝猫推客我认为是比较又潜力的平台&#xff0c;经过几天测试数据和结算都…

网络规划设计

文章目录 一、网络架构设计1.1 单核心双核心1.1.1 单核心1.1.2 双核心端口聚合 链路聚合网关冗余VRRP堆叠技术生成树STPPOE以太网供电服务器冗余&负载均衡服务器双机热备 1.2 环网架构设计1.3 层次化架构设计1.3.2 三层网络架构设计1.3.3 园区大二层网络架构1.3.4 数据中心…

最详细STM32,cubeMX串口发送,接收数据

这篇文章将详细介绍 串口 发送数据&#xff0c;接受数据。 文章目录 前言一、串口的基础知识二、cubeMX 配置三、自动生成代码解析四、串口发送数据函数五、使用串口收发数据点亮 led重定向函数&#xff1a; 总结 前言 实验开发板&#xff1a;STM32F103C8T6。所需软件&#xf…

【TES605】基于Virtex-7 FPGA的高性能实时信号处理平台

板卡概述 TES605是一款基于Virtex-7 FPGA的高性能实时信号处理平台&#xff0c;该平台采用1片TI的KeyStone系列多核DSP TMS320C6678作为主处理单元&#xff0c;采用1片Xilinx的Virtex-7系列FPGA XC7VX690T作为协处理单元&#xff0c;具有2个FMC子卡接口&#xff0c;各个处理节…

景联文科技:针对敏感数据的安全转录服务,护航信息安全

针对数据的安全转录服务&#xff0c;主要是为了确保数据在转录过程中的安全性和隐私保护。这些服务通常会采用一系列严格的安全措施&#xff0c;如数据加密、访问控制、数据脱敏等&#xff0c;以确保敏感数据不会被泄露或滥用。 景联文科技提供特定的数据转录服务&#xff0c;以…