当前位置: 首页 > news >正文

常用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~ 

相关文章:

常用Win32 API的简单介绍

目录 前言&#xff1a; 控制控制台程序窗口的指令&#xff1a; system函数&#xff1a; COORD函数&#xff1a; GetStdHandle函数&#xff1a; GetConsoleCursorInfo函数&#xff1a; CONSOLE_CURSOR_INFO函数&#xff1a; SetConsoleCursorInfo函数&#xff1a; SetC…...

VM及WindowsServer安装

目录 一.操作系统的简介及常用的操作系统 二.windows的安装 安装VMWare虚拟机 注意点一 ​编辑 注意点二 三.安装配置Windows Server 2012 R2 四、虚拟机的环境配置及连接 1. 主机连接虚拟机 2. 虚拟机环境配置及共享 3. 环境配置 一.操作系统的简介及常用的操作系…...

操作系统【OS】调度算法对比图

FCFS SJF 高响应比 时间片轮转 多级反馈队列 可抢占&#xff1f; √ √ √ 队列内算法不一定 不可抢占&#xff1f; √ √ √ 队列内算法不一定 特点&优点 公平实现简单有利于长作业不利于短作业有利于CPU繁忙作业不利于IO繁忙作业 因为CPU繁忙型进程即…...

音视频开发常见问题(五):视频黑屏

摘要 本文介绍了视频黑屏的可能原因和解决方案。主要原因包括用户主动关闭视频、网络问题和渲染问题。解决方案包括优化网络稳定性、确保视频渲染视图设置正确、提供清晰的提示、实时监测网络质量、使用详细的日志系统、开启视频预览功能、使用视频流回调、处理编解码问题、处…...

力扣 第 368 场周赛

2908. 元素和最小的山形三元组 I 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为它是一个 山形三元组 &#xff1a; i < j < k nums[i] < nums[j] 且 nums[k] < nums[j] 请你找出 nums 中 元素和最小 的…...

文件的常用操作(读取压缩文件、解压、删除)

背景&#xff1a;最近做一个腾讯 cos 桶 文件的读写与本地数据库查询等操作 Retrofit 中文件下载的可以添加 Streaming StreamingGETObservable<ResponseBody> downloadCosFile(Url String downloadUrl);Streaming 的作用&#xff1a; 注解通常用于指示Retrofit或其他HTT…...

Simulation Studio - TRNSYS

简单记录一下最近学习 Simulation Studio的一些经历。 在学习之初&#xff0c;参考了一些大佬们的文章&#xff1a; Fortran学习笔记——1.基本内容 - 知乎 但是我主要的目的是使用Simulation Studio&#xff08;下文用SS代替&#xff09;编译自己的组件&#xff0c;看到Sim…...

python实现串口通信

python实现串口通信是一件简单的事情&#xff0c;只要通过pyserial模块就可以实现。 一、串口通信 1、什么是串口通信&#xff1f; 串口通信是一种通过串行接口&#xff08;Serial Port&#xff09;进行数据传输的通信方式。在串口通信中&#xff0c;数据位按顺序一位一位地传…...

No module named ‘cv2’ 解决方法

目录 解决方案1解决方案2 解决方案1 一般情况下的解决方案 在自己的虚拟环境里面安装就行 pip install opencv-python解决方案2 但是我遇到的情况没有这么简单,我使用了pip list | grep open 搜索含有open字样的opencv的包,结果显示已经安装了 我直接进入我的自定义的虚拟…...

65、内网安全-域环境工作组局域网探针方案

目录 案例1-基本信息收集操作演示案例2-网络信息收集操作演示案例3-用户信息收集操作演示案例4-凭据信息收集操作演示案例5-探针主机域控架构服务操作演示涉及资源 我们攻击内网一般是借助web攻击&#xff0c;直接进去&#xff0c;然后再去攻击内网&#xff0c;那么攻击的对象一…...

C#:EXCEL列名、列序号之间互相转换

EXCEL的列名与列序号 之前的关系如下 A1B2C3D4E5F6G7H8I9J10K11L12M13N14O15P16Q17R18S19T20U21V22W23X24Y25Z26AA27AB28 /// <summary>/// 根据给的EXCEL列序号&#xff0c;得出列名字母/// </summary>/// <param name"iColNum">序号</param&…...

云原生微服务实战 Spring Cloud Alibaba 之 Nacos

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…...

ubuntu gcc版本降级 Reset gcc version from 11.3 to 11.2 on Ubuntu 22.04

aptitude 需要自己安装 sudo apt-get install aptitude # 安装# aptitude的一些常用的操作&#xff1a; sudo aptitude update # 更新软件源 sudo aptitude search 软件名称 # 查看软件 sudo aptitude install 软件名称 …...

基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉 计算机竞赛

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖&#xff0c;适合作为竞赛课…...

Windows客户端下pycharm配置跳板机连接内网服务器

问题&#xff1a;实验室服务器仅限内网访问&#xff0c;无法在宿舍&#xff08;外网&#xff09;访问实验室的所有内部服务器&#xff0c;但同时实验室又提供了一个外网可以访问的跳板机&#xff0c;虽然可以先ssh到跳板机再从跳板机ssh到内网服务器&#xff0c;但这种方式不方…...

美国IP代理如何获取?适用于哪些场景?

美国代理IP可以是静态&#xff08;不会改变&#xff09;或动态&#xff08;周期性更改&#xff09;&#xff0c;并且可以由专业的代理服务提供商提供。不同的代理IP服务提供商可能提供不同类型的代理&#xff0c;包括数据中心代理、住宅代理和移动代理&#xff0c;以满足不同用…...

Java工具库——FastJson的40个常用方法

那些想看却没看的书&#xff0c;在心里摆满一个图书馆… 工具库介绍 阿里巴巴的 FastJSON&#xff0c;也被称为 Alibaba FastJSON 或阿里巴巴 JSON&#xff0c;是一个高性能的 Java JSON 处理库&#xff0c;用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性…...

基于ssm的宠物医院管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

RocketMQ学习笔记(一)

RocketMQ学习笔记 消息中间件应用场景 应用解耦削峰填谷数据分发 常见的消息中间件 ActiveMQ&#xff1a;Apache出品&#xff0c;比较老的一个开源的消息中间件&#xff0c;以前在中小企业应用广泛Kafka&#xff1a;Apache软件基金会开发的一个开源流处理平台&#xff0c;由…...

JavaScript-2-菜鸟教程

字符串 可以使用 索引 位置访问字符串中的每个字符 可以使用内置属性 length 来计算字符串的长度 var txt "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var sln txt.length;<script>var x "John"; // x是一个字符串// 使用 new 关键字将字符…...

发布开源项目到 jitpack

--- theme: github highlight: a11y-dark --- # 发布项目到 jitpack ## *(Gradle7.x 的版本已不适用 android-maven 的方法发布)* ## 1.在要发布android module下的 build.grdle 添加,多个module就添加多个 plugins{ id maven-publish } task sourceJar(type: Jar) { …...

TeeChart for .NET 2023.10.19 Crack

TeeChart.NET 的 TeeChart 图表控件提供了一个出色的通用组件套件&#xff0c;可满足无数的图表需求&#xff0c;也针对重要的垂直领域&#xff0c;例如金融、科学和统计领域。 数据可视化 数十种完全可定制的交互式图表类型、地图和仪表指示器&#xff0c;以及完整的功能集&am…...

代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球

代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球 文章链接&#xff1a;柠檬水找零 根据身高重建队列 用最少数量的箭引爆气球 视频链接&#xff1a;柠檬水找零 根据身高重建队列 …...

完美解决configure: error: APR not found. Please read the documentation.

目录 一、问题&#xff1a; 二、原因&#xff1a; 三、解决方法&#xff1a; 一、问题&#xff1a; ./configure 出现如下问题&#xff1a; configure: error: APR not found. Please read the documentation. 二、原因&#xff1a; 配置&#xff1a;错误&#xff1a;找不…...

Jenkins部署失败:JDK ‘jdk1.8.0_381‘ not supported to run Maven projects

Jenkins部署报错&#xff1a;JDK ‘jdk1.8.0_381’ not supported to run Maven projects提示使用的jdk有问题&#xff0c;启动的jdk版本不能满足项目启动。 登录Jenkins管理页面&#xff0c;系统管理——全局工具配置——JDK安装配置满足条件的JDK版本&#xff0c;保存配置&…...

xml导出pdf简单实现

1. 引入依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>8.0.1</version> </dependency>2. 代码实现 import com.itextpdf.kernel.geom.PageSize; import com.itextpdf.ker…...

JAVAEE初阶相关内容第十六弹--网络编程

写在前 这一节的内容首先是对十五弹&#xff08;UDP回显服务器&#xff09;进行简单的改进&#xff0c;在这基础上开始介绍TCP流套接字编程。 目录 写在前 1.改进回显服务器 1.1完整代码实现 1.2运行输出结果 2.TCP流套接字编程 2.1ServerSocketAPI 2.2SocketAPI 3.TC…...

Python---练习:使用for循环嵌套实现打印九九乘法表

思考&#xff1a; 外层循环主要用于控制循环的行数&#xff0c;内层循环用于控制列数。 基本语法&#xff1a; # 外层循环 for i in 序列1:# 内层循环for j in 序列2:循环体 序列1 序列2 &#xff0c;就可以是range(1, 10) -----也就是从1&#xff0c;到9。 参考while循环…...

mac安装并使用wireshark

mac安装并使用wireshark 1 介绍 我们在日常开发过程中&#xff0c;遇到了棘手的问题时&#xff0c;免不了查看具体网络请求情况&#xff0c;这个时候就需要用到抓包工具。比较著名的抓包工具就属&#xff1a;wireshark、fildder。我这里主要介绍wireshark。 2 安装 以mac安装为…...

torch张量的降维与升维

文章目录 一、降维和升维未完待续.... 一、降维和升维 squeeze和unsqueeze是torch张量常用的降维与升维的一种方式&#xff0c;但这种方式只能增添或减少大小为1的维度&#xff0c;如下&#xff1a; x1 torch.randn(1, 8, 256, 256) x1 torch.squeeze(x1,dim0) print(x1.sh…...