Win32 API 光标隐藏定位和键盘读取等常用函数

news2024/11/19 3:35:10

Win32 API 光标隐藏定位和键盘读取等常用函数

  • 一、Win32 API
  • 二、控制台程序指令
    • mode
    • title
    • pause
    • cls
  • 三、控制台屏幕上坐标的结构体COORD
  • 四、句柄获取函数GetStdHandle
  • 五、控制台光标操作
    • 1.控制台光标信息结构体CONSOLE_CURSOR_INFO
    • 2.得到光标信息函数GetConsoleCursorInfo
    • 3. 设置光标信息函数SetConsoleCursorInfo
    • 4. 设置光标位置函数SetConsoleCursorPosition
  • 六、键盘读取函数GetAsyncKeyState

以下代码使用的是 VS2022环境的C语言

一、Win32 API

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

二、控制台程序指令

平常我们运行起来的黑框程序其实就是控制台程序

mode

可以使用cmd命令来设置控制台窗口的长宽:设置控制台窗口的大小,30行,100列

mode con cols=100 lines=30

参考:mode

title

通过命令设置控制台窗口的名字:

title 贪吃蛇

参考:title

这些能在控制台窗口执行的命令,也可以调用C语言函数system来执行。例如:

#include <stdio.h>
int main()
{
	 //设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,30⾏,100列
	 system("mode con cols=100 lines=30");
	 //设置cmd窗⼝名称
	 system("title 贪吃蛇"); 
	 return 0;
}

pause

暂停批处理程序的处理,显示提示,Press any key to continue . . .

pause

参考:pause

cls

可以刷新控制台窗口

cls

参考:cls

三、控制台屏幕上坐标的结构体COORD

COORD 是Windows API中定义的⼀个结构体,表示一个字符在控制台屏幕幕缓冲区上的坐标,坐标系(0,0) 的原点位于缓冲区的顶部左侧单元格。
在这里插入图片描述
COORD类型的声明:

typedef struct _COORD {
 SHORT X;			// x坐标
 SHORT Y;			// y坐标
} COORD, *PCOORD;

给坐标赋值:

COORD pos = { 10, 15 };

参考:COORD

四、句柄获取函数GetStdHandle

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

HANDLE GetStdHandle(DWORD nStdHandle);		// 标准设备值

参考:GetStdHandle

五、控制台光标操作

1.控制台光标信息结构体CONSOLE_CURSOR_INFO

CONSOLE_CURSOR_INFO 是Windows API中定义的⼀个结构体。表示光标在控制台中的信息。
• dwSize,由光标填充的字符单元格的百分比。 此值介于1到100之间。 光标外观会变化,范围从完全填充单元格到单元底部的水平线条。
• bVisible,游标的可见性。 如果光标可见,则此成员为 TRUE。

typedef struct _CONSOLE_CURSOR_INFO {
  DWORD dwSize;				// 光标填充的当前字符单元的百分比
  BOOL  bVisible;			// 光标是否可见
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

参考:CONSOLE_CURSOR_INFO

2.得到光标信息函数GetConsoleCursorInfo

检索有关指定控制台屏幕缓冲区的光标大小和可见性的信息

BOOL WINAPI GetConsoleCursorInfo(
 HANDLE hConsoleOutput,							// 获得当前控制台句柄
 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo		// 光标信息结构体的指针
);

参考:GetConsoleCursorInfo

实例:

HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息

3. 设置光标信息函数SetConsoleCursorInfo

设置指定控制台屏幕缓冲区的光标的大小和可见性

BOOL WINAPI SetConsoleCursorInfo(
 HANDLE hConsoleOutput,
 const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);

参考:SetConsoleCursorInfo

实例:

HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态

4. 设置光标位置函数SetConsoleCursorPosition

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

BOOL WINAPI SetConsoleCursorPosition(
 HANDLE hConsoleOutput,
 COORD pos
);

参考:SetConsoleCursorPosition

实例:

 COORD pos = { 10, 5};
 HANDLE hOutput = NULL;
 //获取标准输出的句柄(⽤来标识不同设备的数值)
 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
 //设置标准输出上光标的位置为pos
 SetConsoleCursorPosition(hOutput, pos)

SetPos:封装一个设置光标位置的函数

//设置光标的坐标
void SetPos(short x, short y)
{
	 COORD pos = { x, y };
	 HANDLE hOutput = NULL;
	 //获取标准输出的句柄(⽤来标识不同设备的数值)
	 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	 //设置标准输出上光标的位置为pos
	 SetConsoleCursorPosition(hOutput, pos);
}

六、键盘读取函数GetAsyncKeyState

获取按键情况,GetAsyncKeyState的函数原型如下:

SHORT GetAsyncKeyState(
 int vKey
);

将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。

GetAsyncKeyState 的返回值是short类型,在上⼀次调用 GetAsyncKeyState 函数后,如果返回的16位的short数据中,最高位是1,说明按键的状态是按下,如果最高是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。

如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1。

#define KEY_PRESS(VK) ((GetAsyncKeyState(VK) & 0x1) ? 1 : 0)

参考:虚拟键码(Winuser.h) - Win32 apps

实例:

#include <stdio.h>
#include <windows.h>
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;
}

当然,有一些常见的虚拟键码需要留意一下:

常见的虚拟键码对应define常数
ESC 键VK_ESCAPE0x1B
空格键VK_SPACE0x20
UP ARROW 键 (上方向键:↑)VK_UP0x26
DOWN ARROW 键 (下方向键:↓)VK_DOWN0x28
LEFT ARROW 键 (左方向键:←)VK_LEFT0x25
RIGHT ARROW 键 (右方向键:→)VK_RIGHT0x27

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

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

相关文章

会跳舞的网站引导页HTML源码

源码介绍 这套引导页源码非常好看&#xff0c;网址也不会不停的动起来给人一种视觉感很强烈 简单修改一下里面的地址就行看&#xff0c;非常简单&#xff01; 效果预览 源码下载 会跳舞的网站引导页HTML源码

排序FollowUp

FollowUp 插入排序 直接插入排序 时间复杂度:最坏情况下:0(n^2) 最好情况下:0(n)当数据越有序 排序越快 适用于: 待排序序列 已经基本上趋于有序了! 空间复杂度:0(1) 稳定性:稳定的 public static void insertSort(int[] array){for (int i 1; i < array.length; i) {int…

64位整数高低位的数据获取与赋值操作探讨

参考本篇->LOWORD和HIWORD函数_hidword-CSDN博客 一&#xff0c;如何获取一个64位整数的高32位和低32位 原理其实很简单&#xff1a; 解释一些概念 ①十六进制和二进制直接挂钩 一个十六位的十六进制数【0XAABBCCDD12345678】转为二进制的过程是把其中的每个数转为对应的二…

构建中小型企业网络-单臂路由

1.给IP地址配置好对应的IP和网关 2.配置交换机 3.路由配置 在交换机ge0/0/1中配置端口为trunk是可以允许多个vlan通过的&#xff0c;但路由器是不能够配置vlan&#xff0c;而交换机和路由器间连接的只有一根线&#xff0c;一个端口又只能配置一个ip地址&#xff0c;只有一个ip地…

人脸识别概念解析

目录 1. 概述 2. 人脸检测 3. 人脸跟踪 4. 质量评价 5. 活体检测 6. 特征提取 7. 人脸验证 8. 人脸辨识 1. 概述 人脸识别在我们的生活中随处可见&#xff0c;例如在大楼门禁系统中&#xff0c;它取代了传统的门禁卡或密码&#xff0c;提高了进出的便捷性和安全性。在商…

如何通过4G DTU实现现场仪表的分布式采集并发布到MQTT服务器

提供一份资料文档以一个具体的工程案例来讲解&#xff0c;如何通过4G DTU实现现场仪表的分布式采集并发布到MQTT服务器。采用的数据采集模块是有人物联的边缘采集4G DTU&#xff0c;采集多个多功能电表和远传水表的数据&#xff0c;通过MQTT通讯的型式传送给MQTT服务器&#xf…

Elsevier(爱思唯尔)期刊—Latex模板下载、使用、投稿过程

目录 一、Elsevier期刊-Latex模板下载 1. Elsevier 通用latex模板下载&#xff1a;【elsarticle.zip】 2. Elsevier 复杂版式latex模板下载&#xff1a;【els-cas-templates.zip】&#xff0c;有单栏和双栏版本 二、Elsevier期刊-Latex模板使用 1. 通用模板【elsarticle.zi…

【源码】IM即时通讯源码/H5聊天软件/视频通话+语音通话/带文字部署教程

【源码介绍】 IM即时通讯源码/H5聊天软件/视频通话语音通话/带文字部署教程 【源码说明】 测试环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态laravel5&#xff0c;根据情况开启SSL 登录后台看到很熟悉。。原来是…

如何在 Ubuntu 12.04 上使用 Apache 配置 WebDAV 访问

简介 WebDAV 是内置在 HTTP 中的分布式网络编辑实现&#xff0c;允许您轻松共享文件并与他人协作。 我们可以在 Web 服务器中安装此扩展&#xff0c;以允许通过 Web 浏览器远程读写访问本地文件。在本指南中&#xff0c;我们将在带有 Apache Web 服务器的 Ubuntu 12.04 VPS 上…

Mysql--创建数据库

一、创建一个数据库 “db_classes” mysql> create database db_classes; mysql> show databases; -------------------- | Database | -------------------- | db_classes | | information_schema | | mysql | | performance_schema | |…

PeLK: 大卷积核强势回归,高达101 × 101,提出了外围卷积

paper&#xff1a;https://arxiv.org/pdf/2403.07589 code&#xff1a;暂无 目录 0. 摘要 1. 引言 2. 相关工作 2.1. Large Kernel Convolutional Networks 2.2. Peripheral Vision for Machine Learning 3. 密集卷积优于条纹卷积 4. 参数高效的大核卷积神经网络 4.1. …

【Vue】如何使用Webpack实现打包操作

一、Webpack介绍 Webpack最主要的作用就是打包操作&#xff0c;由两个核心部分构成分别是“出口”与“入口”。wbepack是现在比较热门的打包工具了&#xff0c;它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。说的直白一点&#xff0c;通过webpac…

ansible-playbook离线升级centos内核

目录 概述实践ansible目录结构关键代码执行效果 结束 概述 内核离线包官网下载地址如下&#xff1a; 地址 实践 ansible目录结构 如对 ansible 不熟悉&#xff0c;离线包下载有问题&#xff0c;请至此地址下载&#xff0c;按本文操作可直接使用。 相关文章链接如下 文章地…

Java基础_集合类_List

List Collection、List接口1、继承结构2、方法 Collection实现类1、继承结构2、相关类&#xff08;1&#xff09;AbstractCollection&#xff08;2&#xff09;AbstractListAbstractSequentialList&#xff08;子类&#xff09; 其它接口RandomAccess【java.util】Cloneable【j…

Android Studio gradle 默认sourceSets配置

一. AS默认的sourceSets配置 sourceSets在Android插件中如何使用的&#xff1a;android {sourceSets {main {manifest.srcFile AndroidManifest.xmljava.srcDirs [src]resources.srcDirs [src]aidl.srcDirs [src]renderscript.srcDirs [src]res.srcDirs [res]assets.srcD…

企业智能名片小程序:AI智能跟进功能助力精准营销新篇章

在数字化浪潮的推动下&#xff0c;企业营销手段不断迭代升级。如今&#xff0c;一款集手机号授权自动获取、智能提醒、访客AI智能跟进及客户画像与行为记录于一体的企业智能名片小程序&#xff0c;正以其强大的AI智能跟进功能&#xff0c;助力企业开启精准营销的新篇章。 通过深…

STM32用HAL库函数实现硬件IIC

/*出处&#xff1a;【STM32入门教程-2024】第12集 IIC通信与温湿度传感器AHT20(DHT20)_哔哩哔哩_bilibili */ 这篇笔记我主要介绍代码实现&#xff0c;想要了解原理的请自己看视频&#xff0c;我不过多赘述了。 AHT20通信数据帧格式&#xff1a; ①对照手册上的通信流程写初…

政安晨:【Keras机器学习示例演绎】(二十)—— 综合梯度的模型可解释性

目录 综合梯度 设置 综合梯度算法 可视化渐变和集成渐变的辅助类 让我们试一试 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c…

debian配置BIND DNS服务器

前言 局域网内有很多台主机&#xff0c;IP难以记忆。 而修改hosts文件又难以做到配置共享和统一&#xff0c;需要一台内网的DNS服务器。 效果展示 这里添加了一个域名hello.dog&#xff0c;将其指向为192.168.1.100。 同时&#xff0c;外网的域名不会受到影响&#xff0c;…

实验8 NAT配置

实验8 NAT配置 一、 原理描述二、 实验目的三、 实验内容1.实验场景2.实验要求 四、 实验配置五、 实验步骤2.静态NAT配置3.NAT Outbound配置4.NAT Easy-IP配置 一、 原理描述 2019年11月26日&#xff0c;全球43亿个IPv4地址正式耗尽&#xff0c;这意味着没有更多的IPv4地址可…