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

Windows控制台函数:移动光标位置函数SetConsoleCursorPosition()

目录

什么是 SetConsoleCursorPosition?

它长什么样?

什么是 COORD?

怎么用它?

它有什么用?

跟 C++ 标准库有什么不一样?

注意事项

再试一个有趣的例子

什么是 SetConsoleCursorPosition?

SetConsoleCursorPosition 是一个 Windows API 函数,用来移动控制台的光标位置。你可以把它想成一个遥控器,告诉屏幕上的那个闪烁小光标(就是输入文字时跳动的那个小线):“嘿,去这个位置等着!”

在控制台程序里,默认情况下,光标会随着你输入或输出的文字自动移动。但如果你想自己控制它,比如让文字出现在屏幕的特定位置(像画图或做游戏那样),就需要用这个函数。

它长什么样?

  • Set:表示设置(改变)某个值或状态。

  • Console:指的是控制台,即 Windows 终端窗口。

  • Cursor:指的是光标,在控制台中,光标表示当前输入或输出的文本位置。

  • Position:指的是位置,即光标所在的坐标。

在代码里,SetConsoleCursorPosition 是这样的:

BOOL SetConsoleCursorPosition(HANDLE hConsoleOutput,    // 屏幕的“钥匙”COORD dwCursorPosition    // 光标要去的地方
);
  • HANDLE hConsoleOutput: 这是你用 GetStdHandle(STD_OUTPUT_HANDLE) 拿到的屏幕钥匙。

  • COORD dwCursorPosition: 一个坐标,告诉函数光标要去哪里。COORD 是一个小结构体,包含 X(水平位置)和 Y(垂直位置)。

  • 返回值是 BOOL:成功返回 TRUE,失败返回 FALSE。

什么是 COORD?

COORD 是一个 Windows 定义的小东西,长这样:

typedef struct _COORD {SHORT X; // 横坐标(列号,从 0 开始)SHORT Y; // 纵坐标(行号,从 0 开始)
} COORD;
  • X 是列号,从左到右数(0 是最左边)。

  • Y 是行号,从上到下数(0 是最上面)。

怎么用它?

假设你想把光标移动到第 5 行、第 10 列,然后在那里写“Hello”,可以这样做:

#include <windows.h>int main() {// 1. 拿到屏幕的“钥匙”HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);if (screen == INVALID_HANDLE_VALUE) {return 1; // 钥匙坏了,退出}// 2. 设置光标要去的地方COORD position;    // 准备一个坐标position.X = 10;   // 第 10 列position.Y = 5;    // 第 5 行// 3. 移动光标SetConsoleCursorPosition(screen, position);// 4. 在新位置写东西const char* message = "Hello";DWORD written;WriteConsoleA(screen, message, strlen(message), &written, NULL);return 0;
}

一步步解释:

  1. 拿到钥匙:

    • 用 GetStdHandle(STD_OUTPUT_HANDLE) 拿到屏幕的钥匙,存在 screen 里。

  2. 准备坐标:

    • COORD position 是一个坐标变量。

    • position.X = 10 表示光标移到第 10 列(从左边数第 11 个位置,因为从 0 开始)。

    • position.Y = 5 表示光标移到第 5 行(从顶部数第 6 行)。

  3. 移动光标:

    • SetConsoleCursorPosition(screen, position) 用屏幕钥匙把光标送到指定位置。

  4. 写东西:

    • 用 WriteConsoleA 在光标的新位置写下“Hello”。

运行这个程序,你会看到“Hello”出现在控制台的第 5 行、第 10 列,而不是默认的左上角。

它有什么用?

  • 控制输出位置:比如你想在屏幕上画一个表格,或者让文字跳来跳去。

  • 做小游戏:像贪吃蛇、俄罗斯方块这种控制台游戏,需要不停移动光标来更新画面。

  • 美化界面:让你的程序看起来更有条理,而不是全挤在左上角。

跟 C++ 标准库有什么不一样?

C++ 的 std::cout 没法直接控制光标位置。如果你用 std::cout << "Hello";,文字会紧接着上一次输出的地方出现,想跳到别的地方得靠一些奇怪的办法(比如输出很多空格或换行)。而 SetConsoleCursorPosition 让你直接“遥控”光标,想去哪就去哪。

注意事项

  1. 屏幕大小:

    • 控制台有边界(默认可能是 80 列 × 25 行,具体看你的设置)。如果 X 或 Y 超出范围,函数会失败。

    • 比如,设 position.X = 100 而你的屏幕只有 80 列,就会出错。

  2. 检查返回值:

    • 最好检查一下是否成功:

if (!SetConsoleCursorPosition(screen, position)) {return 1; // 出错了
}

     3.光标不会自动回来:

  • 移动光标后,下次输出会从新位置开始,不会自动回到左上角。

再试一个有趣的例子

我们让光标跳来跳去,写几个单词:

#include <windows.h>int main() {HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);if (screen == INVALID_HANDLE_VALUE) {return 1;}COORD pos;DWORD written;// 在 (5, 2) 写 "Top"pos.X = 5; pos.Y = 2;SetConsoleCursorPosition(screen, pos);WriteConsoleA(screen, "Top", 3, &written, NULL);// 在 (10, 5) 写 "Middle"pos.X = 10; pos.Y = 5;SetConsoleCursorPosition(screen, pos);WriteConsoleA(screen, "Middle", 6, &written, NULL);// 在 (2, 8) 写 "Bottom"pos.X = 2; pos.Y = 8;SetConsoleCursorPosition(screen, pos);WriteConsoleA(screen, "Bottom", 6, &written, NULL);return 0;
}

运行后,你会看到“Top”、“Middle”、“Bottom”出现在控制台的不同位置,像个小布局。 

相关文章:

Windows控制台函数:移动光标位置函数SetConsoleCursorPosition()

目录 什么是 SetConsoleCursorPosition&#xff1f; 它长什么样&#xff1f; 什么是 COORD&#xff1f; 怎么用它&#xff1f; 它有什么用&#xff1f; 跟 C 标准库有什么不一样&#xff1f; 注意事项 再试一个有趣的例子 什么是 SetConsoleCursorPosition&#xff1f;…...

MyBatis-Plus 注解大全

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 MyBatis-Plus 注解大全 MyBatis-Plus 是基于 MyBatis 的增强工具&#xff0c;通过注解简化了单表 CRUD 操作和复杂查询的配置。以下是常用注解的分类及详细说…...

Redis基础之基础概念

NoSQL数据库的优点 1.直接减少CPU与IO压力&#xff0c;是直接通过内存来读取的 2.可以直接作为缓存使用&#xff0c;减少IO操作 如果我们在请求中需要来传递数据&#xff0c;使用NoSQL可以来进行数据的直接存储和读取&#xff0c;从而来减少CPU与IO压力 或者是如果一些数据较为…...

Django小白级开发入门

1、Django概述 Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MTV的框架模式&#xff0c;即模型M&#xff0c;视图V和模版T。 Django 框架的核心组件有&#xff1a; 用于创建模型的对象关系映射为最终用户设计较好的管理界面URL 设计设计者友好的模板…...

热图回归(Heatmap Regression)

热图回归(Heatmap Regression)是一种常用于关键点估计任务的方法,特别是在人体姿态估计中。它的基本思想是通过生成热图来表示某个关键点在图像中出现的概率或强度。以下是热图回归的主要特点和工作原理: 主要特点 热图表示: 每个关键点对应一个热图,热图中的每个像素值…...

SpringSecurity认证授权完整流程

SpringSecurity认证流程&#xff1a;loadUserByUsername&#xff08;&#xff09;方法内部实现。 实现步骤&#xff1a; 构建一个自定义的service接口&#xff0c;实现SpringSecurity的UserDetailService接口。建一个service实现类&#xff0c;实现此loadUserByUsername方法。…...

MongoDB用户管理和复制组

用户管理 1、建用户时&#xff0c;use到的库就是此用户的验证库 2、登录时必须明确指定验证库才能登录 3、通常管理员用的验证库是admin&#xff0c;普通用户的验证库一般是所管理的库设置为验证库 4、如果直接登录到数据库&#xff0c;不进行use&#xff08;示例&#xff…...

【Android】setText调用导致的悬浮窗抖动问题

在Android13中&#xff0c;有这么一个bug&#xff0c;写一个可以拖到的悬浮窗&#xff0c;这个悬浮窗里有TextView&#xff0c;在拖到某个位置后&#xff0c;再调用TextView的setText方法&#xff0c;会发现出现了一个窗口动画&#xff0c;悬浮窗跳到了起始位置&#xff0c;从开…...

【从零开始学习计算机科学】数字逻辑(四)数字系统设计

【从零开始学习计算机科学】数字逻辑(四)数字系统设计 数字系统设计硬件描述语言 HDL(Hardware Description Language)Verilog HDL 的起源与发展HDL 软核、固核和硬核的重用HDL 的应用数字系统设计实现数字系统设计 一个数字集成电路的可以从不同的层次(系统级、算法级、…...

QT 作业 C++ day5

作业 代码 MyQThread.h class MyThread : public QThread {Q_OBJECT public:MyThread(QObject *parent nullptr); protected:void run() override; signals://向ui界面发送的 "复制进度" 的信号void copy_process_signal(int index); public slots:// "复…...

洛谷 P2234:[HNOI2002] 营业额统计 ← STL set

【题目来源】 https://www.luogu.com.cn/problem/P2234 【题目描述】 Tiger 最近被公司升任为营业部经理&#xff0c;他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger 拿出了公司的账本&#xff0c;账本上记录了公司成立以来每天的营业额。分析…...

植物神经功能紊乱检查不出来,浑身难受?

植物神经功能紊乱&#xff0c;又称为自主神经功能失调&#xff0c;是一种功能性神经症&#xff0c;它涉及身体多个系统的不规则反应&#xff0c;通常没有器质性病变作为基础。这意味着&#xff0c;尽管患者可能会体验到多种症状&#xff0c;如焦虑、紧张、心悸、疲劳、失眠等&a…...

vue3 遇到babel问题(exports is not defined) 解决方案

由于我在引用ant-design-vue插件&#xff0c;于是产生了下图的问题。 1.问题分析 Babel 是一个 JavaScript 编译器&#xff0c;主要用于&#xff1a;将 ES6 代码转译为 ES5 代码&#xff0c;以兼容旧版浏览器。处理模块化语法&#xff08;如 import/export&#xff09;。 2.解…...

基于SpringBoot+Vue的工商局商家管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

ESP8266 入门(第 2 部分):使用 AT 命令

使用 AT 命令对 WiFi 收发器ESP8266编程 本教程是上一个教程 ESP8266 入门(第 1 部分)的延续。因此,简单回顾一下,在之前的教程中,我们介绍了 ESP 模块,并学习了一些基础知识。我们还使用 FTDI 串行适配器模块制作了一个开发板,该模块可以很容易地用于使用 AT 命令和 A…...

【CSS3】筑基篇

目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…...

11-Agent中配置自己的插件

目录 关键词 摘要 速览 配置和集成自定义插件 使用AI插件在直播间绘制图像 API接口调用及配置说明 创建和配置API工具以生成图像 编写和配置参数及API调用说明 如何配置和使用API进行HTTP请求 配置和测试API插件的步骤 思维导图 发言总结 要点回顾 如何配置一个专…...

2025-03-08 学习记录--C/C++-PTA 习题10-1 判断满足条件的三位数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 裁判测试程序样例&#xff1a; #include <stdio.h> #include <math.h>int search( int n );int…...

INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性

INFINI Labs 产品更新发布&#xff01;此次更新&#xff0c;Easysearch 增加了新的功能和数据类型&#xff0c;包括 wildcard 数据类型、Point in time 搜索 API、异步搜索 API、数值和日期字段的 doc-values 搜索支持&#xff0c;Console 新增了日志查询功能。 INFINI Easyse…...

关于网络数通工程师 OSPF 协议的常见面试问题

基础理论部分‌ ‌OSPF是什么&#xff1f;其核心设计目标及主要特性有哪些&#xff1f;‌ OSPF&#xff08;开放式最短路径优先&#xff09;是基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;使用Dijkstra的SPF算法计算最短路径树&#xff0c;核心目标包括…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...