常用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.rhkb.cn/news/169010.html

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

相关文章

Vue 实战项目(智慧商城项目): 完整的订单购物管理功能 内涵资源代码 基于Vant组件库 Vuex态管理 基于企业级项目开发规范

鹏鹏老师的实战开发项目 智慧商城项目 接口文档&#xff1a;安全问题&#xff08;需要私信即可&#xff09; 演示地址&#xff1a;跳转项目地址 01. 项目功能演示 1.明确功能模块 启动准备好的代码&#xff0c;演示移动端面经内容&#xff0c;明确功能模块 在这里插入图…

DevExpress WinForms甘特图组件 - 轻松集成项目管理功能到应用

DevExpress WinForms Gantt&#xff08;甘特图&#xff09;控件允许您在下一个WinForms桌面应用程序中快速合并项目规划和任务调度功能。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于…

【超参数研究02】使用随机搜索优化超参数

一、说明 在神经网络训练中&#xff0c;超参数也是需要优化的&#xff0c;然而在超参数较多&#xff08;大于3个&#xff09;后&#xff0c;如果用穷举的&#xff0c;或是通过经验约摸实现就显得费时费力&#xff0c;无论如何&#xff0c;这是需要研究、规范、整合的要点&#…

Banana Pi BPI-M4 Berry 采用全志H618芯片,板载2G RAM和8G eMMC

BPI-M4 Berry 开发板作为一款强大的单板计算机&#xff08;SBC&#xff09;&#xff0c;充分挖掘了全志 H618 系统级芯片&#xff08;SoC&#xff09;的功能&#xff0c;为开发人员提供了令人印象深刻的性能和丰富的特性。与树莓派 4b 类似&#xff0c;BPI-M4 Berry 能够展现与…

网站页脚展示备案号并在新标签页中打开超链接

备案时&#xff0c;我们就注意到&#xff0c;备案成功后需要在网站首页底部展示“备案号”&#xff0c;并将备案号链接至https://beian.miit.gov.cn。 这里我使用了WrodPress中的主题&#xff0c;主题自定义中有提供对页脚文本的编辑&#xff0c;支持用css标签定义样式。若是自…

MySQL MVCC机制探秘:数据一致性与并发处理的完美结合,助你成为数据库高手

一、前言 在分析 MVCC 的原理之前&#xff0c;我们先回顾一下 MySQL 的一些内容以及关于 MVCC 的一些简单介绍。&#xff08;注:下面没有特别说明默认 MySQL 的引擎为 InnoDB &#xff09; 1.1 数据库的并发场景 数据库并发场景有三种&#xff0c;分别是&#xff1a; 读-读…

基于springboot实现广场舞团平台系统项目【项目源码+论文说明】计算机毕业设计

基于SPRINGBOOT实现广场舞团平台系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&am…

算法通关村第十一关青铜挑战——移位运算详解

大家好&#xff0c;我是怒码少年小码。 计算机到底是怎么处理数字的&#xff1f; 数字在计算机中的表示 机器数 一个数在计算机中的二进制表示形式&#xff0c;叫做这个数的机器数。 机器数是带符号的&#xff0c;在计算机用一个数的最高位存放符号&#xff0c;正数为0&am…

Unity之ShaderGraph如何实现全息投影效果

前言 今天我们来实现一个全息投影的效果&#xff0c;如下所示&#xff1a; 主要节点 Position&#xff1a;提供对网格顶点或片段的Position 的访问&#xff0c;具体取决于节点所属图形部分的有效着色器阶段。使用Space下拉参数选择输出值的坐标空间。 Time&#xff1a;提…

C++入门(3):引用,内联函数

一、引用 1.1 引用特性 引用必须初始化 一个变量可以有多个引用 引用一旦引用一个实体&#xff0c;就不能引用其他实体 int main() {int a 10, C 20;int& b a;b c; // 赋值&#xff1f;还是b变成c的别名&#xff1f;return 0; }1.2 常引用 引用权限可以平移或缩小…

ubuntu双系统安装以及启动时卡死解决办法

目录 一.简介 二.安装 如何安装Ubuntu20.04(详细图文教程-CSDN博客 Ubuntu22.04&#xff08;非虚拟机&#xff09;安装教程&#xff08;2023最新最详细&#xff09;-CSDN博客 三.ubuntu双系统启动时卡死解决办法&#xff08;在ubuntu16.04和18.04测试无误&#xff09; 问题…

vue实现响应式改变scss样式

需求&#xff1a;侧边导航栏点击收起&#xff0c;再次点击展开&#xff0c;但是我这个项目的位置是在左侧菜单栏所以需要自定义 效果图&#xff1a; 实现步骤&#xff1a; 1&#xff1a;定义一个变量&#xff08;因为我这里会存储菜单栏的状态所以需要存储状态&#xff0c;一…

09、Python 字典入门 及 高级用法

目录 字典创建字典通过key访问value添加key-value对删除key-value对替换key-value对 判断是否包含指定keydict与列表字典的常用方法演示&#xff1a; 用字典格式化字符串 创建字典 操作字典key-value对 理解dict与list的关系 字典常用方法 使用字典格式化字符串 字典 字典用于…

2023/10/23 mysql学习

数据库修改 show databases; 展示所有数据库 create database 数据库名; 创建数据库 create database if not exists 数据库名; 如果未创建过当前数据库名则创建 drop database 数据库名; drop database if exists 数据库名;用法和创建类似 删除数据库 use 数据库名; 跳…

分享一下商城小程序怎么设置分销功能

随着互联网的快速发展&#xff0c;传统的营销方式已经无法满足企业的需求。在这个时代&#xff0c;拥有一个高效的分销系统已经成为了企业成功的关键之一。而商城小程序作为近年来火爆的电商新模式&#xff0c;其中的分销功能更是备受关注。本文将以分销功能为主要主题&#xf…

Rockchip RK3399 - DRM crtc基础知识

一、LCD硬件原理 1.1 CRT介绍 CRT是阴极射线管(Cathode Ray Tube)的缩写&#xff0c;它是一种使用电子束在荧光屏上创建图像的显示设备。CRT显示器在过去很长一段时间内是主流的显示技术&#xff0c;现已被液晶显示屏或其他新兴技术所替代。 在CRT显示器中&#xff0c;扫描电子…

分享一下微信小程序的文章中怎么添加营销活动

在数字化时代&#xff0c;小程序已经成为企业营销的重要工具。通过小程序&#xff0c;企业可以提供更加便捷、高效的服务&#xff0c;吸引更多的用户和客户。本文将以小程序营销活动为主题&#xff0c;介绍如何在小程序文章中加入营销活动&#xff0c;提高品牌知名度和销售额。…

C/C++数据结构——队列

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;数据结构_仍有未知等待探索的博客-CSDN博客 目录 一、前言 二、队列的基本操作&#xff08;循环队&#xff09; 1、循环队的数据类型 2、循环队的名词解释 3、循环队的创建及…

Windows与Linux服务器互传文件

使用winscp实现图形化拖动的方式互传文件. 1.下载winscp软件并安装&#xff0c;官方地址&#xff1a; https://winscp.net/eng/index.php 2.打开软件&#xff1a; 文件协议选择scp&#xff0c;输入linux服务器的IP和端口号&#xff0c;然后输入你的用户名和密码就可以登陆了。…

基于Java的校园餐厅订餐管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…