windows C/C++ 使控制台窗口全屏

【C++】Windows控制台API基本使用(上) 目录前言一、控制台缓冲区大小一、获取缓冲区大小二、设置缓冲区大小三、更详细的结构体二、窗口大小一、获取窗口大小二、设置窗口大小三、光标位置一、获取光标位置二、设置光标位置四、设置光标是否显示一、旧版API二、新版控制台的 ANSI 转义序列三、新版控制台特性五、通过代码打开 ANSI 转义序列六、控制台编码一、设置输出编码二、设置输入编码七、修改控制台文本样式一、使用API二、使用ANSI转义序列八、控制台窗口标题一、获取控制台窗口标题二、设置窗口标题一、使用旧版API二、使用转义序列三、获取控制台原始标题 阅读详情
AI摘要

本文介绍在Windows环境下使用cmd命令和Windows API实现控制台窗口全屏化及优化显示的方法,包括获取屏幕大小、计算字符大小、设置控制台窗口大小和位置,并通过代码示例详细阐述整个过程。

背景

  时间[2018年07月23日 中午]
  在写windows控制台应用程序的时候,我们希望修改一下控制台窗口的大小以及位置等信息。

方法

方法一:使用cmd命令mode

  语法: MODE CON[:] [COLS=c] [LINES=n]
  指定控制台行数及列数,行、列的单位为字符。
  C/C++中使用system()调用该命令,例如:
  system(“mode con: cols=120 lines=40”);
  
  要使用控制台窗口全屏化,首先要得到屏幕的大小,分别使用GetSystemMetrics(SM_CXSCREEN)和GetSystemMetrics(SM_CYSCREEN)获取屏幕的宽度和高度,单位为像素。由于mode con的单位是字符,需要将屏幕大小信息进行转换,因此我们又需要得到每个字符的宽和高所占用的像素数,可以使用GetCurrentConsoleFont()和GetConsoleFontSize()来获取。
  
示例代码:

/*******************************************************************************
 * 获取控制台当前字体大小
 ******************************************************************************/
COORD get_font_size()
{
    COORD font_size;
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    /* 字体信息 */
    struct CONSOLE_FONT
    {
        DWORD index;
        COORD dim;
    } cfi;
    typedef COORD (WINAPI *PROCGETCONSOLEFONTSIZE)(HANDLE, DWORD);
    typedef BOOL (WINAPI *PROCGETCURRENTCONSOLEFONT)(HANDLE, BOOL, struct CONSOLE_FONT*);

    HMODULE hKernel32 = GetModuleHandle("kernel32");
    PROCGETCONSOLEFONTSIZE GetConsoleFontSize = (PROCGETCONSOLEFONTSIZE)GetProcAddress(hKernel32,"GetConsoleFontSize");
    PROCGETCURRENTCONSOLEFONT GetCurrentConsoleFont = (PROCGETCURRENTCONSOLEFONT)GetProcAddress(hKernel32,"GetCurrentConsoleFont");

    GetCurrentConsoleFont(handle, FALSE, &cfi);             /* 获取当前字体索引信息 */
    font_size = GetConsoleFontSize(handle, cfi.index);      /* 获取当前字体宽高信息[字符宽度及高度所占像素数] */

    return font_size;
}

/*******************************************************************************
 * 最大化展示控制台窗口
 ******************************************************************************/
void full_screen()
{
    HWND hwnd = GetForegroundWindow();
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);   /* 标准输出缓冲区句柄 */
    int cx = GetSystemMetrics(SM_CXSCREEN);            /* 屏幕宽度 */
    int cy = GetSystemMetrics(SM_CYSCREEN);            /* 屏幕高度 */

    COORD size = get_font_size();
    char cmd[32] = { 0 };
    sprintf(cmd, "MODE CON: COLS=%d LINES=%d", cx / size.X, cy / size.Y);
    system(cmd);
    SetWindowPos(hwnd, HWND_TOP, 0, 0, cx, cy, 0);
}

  到目前为止,代码可以运行了,但运行效果并不尽如人意,比如,我不想让控制台窗口的标题栏、状态栏、边框、滚动条等展示出来。在网上搜索了一翻,发现一种解决方案,是将屏幕的宽、高信息添加一个固定的数值,比如300,最后使用MoveWindow()函数设置窗口的左上角位置,即设置了一个大小为标题栏高度的偏移量,如-33,将标题栏放在了可视区之外。这种方法在win8.1上是可行的,但在win10中无效,只能另辟蹊径了。
  

方法二:使用windows api

  相关函数:
  GetWindowLong() 用于获取窗口信息
  SetWindowLong() 用于设置窗口信息
  SetWindowPos() 设置窗口起始位置及大小
  要了解更详细的使用说明,可以查看官方文档。
  
示例代码:

/*******************************************************************************
 * 全屏控制台窗口
 * 取消标题栏及边框
 ******************************************************************************/
void full_screen()
{   
    HWND hwnd = GetForegroundWindow();
    int cx = GetSystemMetrics(SM_CXSCREEN);            /* 屏幕宽度 像素 */
    int cy = GetSystemMetrics(SM_CYSCREEN);            /* 屏幕高度 像素 */

    LONG l_WinStyle = GetWindowLong(hwnd,GWL_STYLE);   /* 获取窗口信息 */
    /* 设置窗口信息 最大化 取消标题栏及边框 */
    SetWindowLong(hwnd,GWL_STYLE,(l_WinStyle | WS_POPUP | WS_MAXIMIZE) & ~WS_CAPTION & ~WS_THICKFRAME & ~WS_BORDER);

    SetWindowPos(hwnd, HWND_TOP, 0, 0, cx, cy, 0);
}

运行结果[win10 + vc6]:
这里写图片描述

附:

  使用api修改控制台缓冲区大小
  SetConsoleScreenBufferSize() 设置控制台缓冲区大小
  
示例代码

/*******************************************************************************
 * 设置控制台窗口起始位置,缓冲区大小及窗口大小
 * top   : 左上角X坐标
 * left  : 左上角Y坐标
 * width :宽度   单位 字符
 * height: 高度  单位 字符
 ******************************************************************************/
void full_screen(int top, int left, SHORT width, SHORT height)
{
    COORD size;
    HWND hwnd = GetForegroundWindow();
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD font_size = get_font_size();

    width = width > GetSystemMetrics(SM_CXMIN) ? width : GetSystemMetrics(SM_CXMIN);
    height = height > GetSystemMetrics(SM_CYMIN) ? height : GetSystemMetrics(SM_CYMIN);
    size.X = width;
    size.Y = height;

    SetConsoleScreenBufferSize(handle, size);
    SetWindowPos(hwnd, HWND_TOP, top, left, size.X * font_size.X, size.Y * font_size.Y, 0);
}
Dev-C++实现经典贪吃蛇:控制台游戏开发与C语言核心实践 控制台应用开发是理解计算机程序运行机制的基础,其核心在于通过字符界面实现交互逻辑。在Windows环境下,开发者常借助标准C库和系统API进行光标控制、屏幕刷新和输入处理,这是学习系统编程和游戏循环原理的经典场景。通过实现一个贪吃蛇游戏,可以深入掌握数组数据结构、状态机设计以及非阻塞输入检测等关键技术,这些技能对于构建更复杂的实时应用和游戏引擎至关重要。本文以Dev-C++为开发环境,详细解析如何利用控制台API和基础C语言特性,从零构建一个完整的命令行贪吃蛇游戏,涵盖游戏循环、碰撞检测和画面渲染等核心模块 阅读详情

相关推荐

C++控制台全屏

C/C++实现窗口伪全屏。本列做控制台全屏,可用于任何窗口。伪全屏,不是真全屏,原理就是隐藏桌面,任务栏,开始按钮,然后把窗口拉到跟屏幕一样大小。 提示: 如果不小心点了测试程序请先按空格键,再顺序按E键X键I键T键(exit)退出!

C++控制台的那些【高级操作】(全)

学习C++刚不久的小萌新,经常会写亿些控制台上神奇的小游戏。 但是,控制台作为一个黑窗口,固然没有其他UI窗口那么灵活, 所以,这里将介绍用控制台做游戏的必备操作!

黑洞极客的博客 1万+

C++编程系列之实现全屏显示

vc++开发!!!初学者适应

VS-c++控制台全屏

如题,简略代码如下 #include <iostream> #include <Windows.h> //VS 自带的头文件 using namespace std; //全屏显示 void MaxScreen() { HWND Hwnd = GetForegroundWindow(); ShowWindow(Hwnd, SW_MAXIMIZE); } int main() { MaxScreen(); return 0; } ...

MoOtA 1368

c++中窗口的全屏化

c++中窗口的全屏化实例程序

数据分析是什么?

说道“数据分析”一词,大家应该并不陌生,数据分析从字面上来理解,就是对数据做出分析然后得出一个结论,看起来浅显易懂,下面我们把这个词语分开得到的是“数据”与“分析”。“数据”的范围就很广泛了,小到一个计量数字,大到成亿级别的数据汇总,都可以称为数据;“分析”一词并不难理解,以智慧思维的方法对某一事物做出合理的解释,给出结论是为分析,一般会用到数学上的分析方法,比如统计学或者概率论等等。 1. 什么是数据分析 1) 数据分析发展背景 进入到 21 世纪以后,伴随着互联网的迅速发展,大数据应运而生,越来越多的数

MC_XY的博客 5432

C/C++蓝屏整人代码

窗口大小调整好之后,上方菜单选择颜色,字体颜色默认白色,应该无需改动,屏幕颜色选择蓝色。,点击属性,上方菜单选择布局,大家按自己电脑的尺寸调整,占满全屏即可,这我就不多说了。按win+R,输入“cmd”按回车键,弹出一个黑色窗口,在任务栏上右击,点击属性(R),弹出。,勾选选自动隐藏任务栏(u)

fzy20110826的博客 4703

单目视觉定位:深入解析PNP算法在机器人导航中的实战应用

本文深入解析了PNP算法在机器人单目视觉定位中的核心原理与实战应用。通过拆解坐标变换四步,详细阐述了如何从二维图像点反求相机三维位姿。文章结合OpenCV的solvePnP函数,提供了算法选择、参数调优及结果后处理的实用指南,并针对机器人导航中的特征匹配、尺度不确定性等挑战,给出了鲁棒性优化与实时性平衡的解决方案。

weixin_29083649的博客 419

C/C++ 控制台 API 性能对比:SetConsoleTitleA 等 5 种窗口操作函数耗时分析

本文深入评测了C/C++中5种关键控制台API的性能表现,包括SetConsoleTitleA、SetConsoleWindowInfo等函数。通过精确到微秒级的测量,揭示了这些API在Windows环境下的真实性能差异,并提供了优化策略,帮助开发者在高频调用场景下提升控制台应用的运行效率。

weixin_33860528的博客 380

f_fs.c 初始化流程(进行中)

前言 之所以选择f_fs.c作为这系列的开始,因为usb在/driver/usb下面的内容实在太多太多,如果讲各种各样点会太分散了。所以决定切入点以实际使用为主,就是f_fs了,目前我了解这是做bulk裸传输使用的,具体的通信协议自己确定。 初始化部分 开始点从这个路径下说起, /drivers/usb/gadget/function/f_fs.c 然后f_fs.c第一个使用的是include/composite.h中的宏定义function #define DECLARE_USB_FUNCTION(_n

weixin_36406973的博客 1967

高斯泼溅(Gaussian Splatting):3D建模的颠覆性革命

高斯泼溅(Gaussian Splatting):3D建模的颠覆性革命

yingtu666的博客 5150

C/C++混合编程实战:从零构建控制台俄罗斯方块游戏

C/C++混合编程是系统级软件开发的核心技术,它结合了C语言的高效、底层控制能力和C++的面向对象特性与抽象机制。其原理在于利用C语言编写与操作系统、硬件交互紧密的模块(如控制台I/O、内存操作),并通过`extern "C"`链接规范确保函数名称在C++中能被正确识别和调用;同时,使用C++构建游戏逻辑、数据结构和算法,利用类、模板等特性提升代码的可维护性和复用性。这种模式的技术价值在于,既能发挥C语言在性能关键路径和平台特定接口上的优势,又能借助C++的现代特性来管理复杂的状态与业务逻辑,是学习系统设计

weixin_34055787的博客 372

【UE 反射】反射的原理是什么?如何使用机制?

静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。

hhw_hhw的博客 6032

C/C++贪吃蛇实战:控制台API与游戏循环设计详解

游戏开发是理解编程核心概念的重要实践领域,其中游戏循环作为驱动逻辑与渲染的核心机制,是实时应用的基础架构。其原理在于通过状态更新、输入处理和画面渲染的周期性执行,构建动态交互体验。在C/C++环境下,掌握Windows Console API等系统级接口,能高效实现控制台图形化,突破传统字符流输出的限制。这对于巩固数据结构、内存管理等底层知识具有显著价值,尤其在开发贪吃蛇这类经典游戏时,需要综合运用数组循环队列处理蛇身移动、碰撞检测算法确保逻辑正确性。通过实现非阻塞键盘输入响应和双缓冲优化等工程技巧,开发者

weixin_33739646的博客 386

在 Eclipse 里快速用上 SAP Joule:ABAP 开发者的 AI 助手上手指南

本文介绍了SAP Joule for developers如何集成在ABAP开发工具中,为开发者提供AI辅助能力。主要内容包括: Joule作为ADT的增强层,直接嵌入开发流程,支持在项目资源管理器、代码编辑器等场景下通过上下文菜单调用AI功能。 核心使用方式:打开Joule视图后,可在开发对象、代码片段等上下文中使用自然语言交互,请求解释、生成测试或获取示例代码。 重点功能: Explain:解释现有代码逻辑,降低理解成本 ABAP Unit测试生成:快速创建与上下文相关的测试用例 支持在传输管理器等完整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 392

手把手教你学Simulink--人形机器人控制场景实例:基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真

matlab编辑% 连杆长度 (m)% 躯干(髋到CoM)% 大腿% 小腿% 质量 (kg)% 转动惯量(绕质心,简化为杆)matlab编辑% 躯干CoM(假设在髋上方L_body/2处)% 左大腿CoM% 左小腿CoM% (右腿类似,略)本文完成了基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真,实现了:✅ 定义7-DOF平面人形结构✅ 使用Symbolic Math Toolbox自动推导动力学方程✅ 生成。

MHD0815的博客 145

C/C++控制台清屏方法全攻略:从闪瞎眼到丝滑流畅

写控制台小游戏的时候,最烦人的问题是什么?刷屏闪烁。你高高兴兴写了个贪吃蛇,一运行屏幕闪得跟迪斯科舞厅似的,眼睛都快瞎了。这篇文章就把C/C++里各种清屏方法从头到尾捋一遍,从最基础的system("cls")到终极解决方案双缓冲,手把手教你告别闪烁。

2501_91189264的博客 554

AI在生物学领域的应用:基因序列分析和人工智能生物学

好的,非常感谢您提供的这个精彩的主题和详细的要求。我会全力以赴,遵循您的要求写一篇内容丰富、结构清晰、论述深入的专业技术文章。现在,就让我们开始这篇关于"AI在生物学领域的应用:基因序列分析和人工智能生物学"的博客文章吧! 1. 背景介绍 1.1 生物信息学的兴起

AI天才研究院 1413

C++控制台迷宫游戏开发:从Windows API到DFS算法实战

在计算机图形学与游戏开发领域,控制台程序是理解底层渲染与交互逻辑的重要起点。其核心原理在于通过字符缓冲区模拟像素显示,结合系统API实现光标定位与颜色控制,从而构建动态可视化界面。这一技术价值在于将抽象的编程概念转化为直观的交互体验,尤其适用于算法可视化与轻量级游戏原型开发。在应用场景上,控制台游戏常作为C++等系统级语言的入门实践项目,帮助开发者掌握消息循环、实时输入处理与游戏循环架构。本文聚焦于迷宫游戏开发,通过深度优先搜索(DFS)算法实现迷宫生成,并结合Windows API的_kbhit()与_g

weixin_30681121的博客 412

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C/C++开发Windows屏保应用:从Win32消息循环到.scr部署的完整实践

用C/C++开发Windows屏保应用,核心是解析/s、/c、/p命令行参数并处理Win32消息循环。本文给出可直接复制的.vcxproj、CMake与MinGW编译配置,把TargetExt设为.scr,配合WM_ERASEBKGND防闪烁与输入退出逻辑,最后复制到System32完成安装验证。接入TaoToken可辅助排查LNK2019等报错,详见 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 。

weixin_42612405的博客 69

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C语言控制台动画实战:Windows API实现流星雨效果

在计算机图形学与动画原理中,局部刷新与帧控制是核心概念。通过操作系统的底层接口,程序可以精确控制屏幕输出位置与属性,实现动态视觉效果。这一技术原理在游戏开发、嵌入式UI及终端可视化中具有重要价值。本文以Windows控制台环境为例,深入讲解如何利用C语言结合Windows API,通过结构体管理对象状态、循环控制动画帧,并调用SetConsoleCursorPosition等函数实现光标精确定位与颜色设置,最终完成一个流畅的流星雨动画项目。该项目综合运用了数组、随机数、延时控制等基础知识,是连接C语言语法学

weixin_32382335的博客 242

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VS-c++控制台取消右侧滑动条

如题,简略代码如下 #include <iostream> #include <Windows.h> //VS 自带的头文件 using namespace std; //取消滑框 void FullScreen() { HANDLE Hand; CONSOLE_SCREEN_BUFFER_INFO Info; Hand = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(Hand, &Info)

MoOtA 1113

C/C++控制台实现动态流星雨:从对象池到双缓冲的图形动画实践

实时图形动画模拟是计算机图形学的基础,其核心原理在于坐标计算、状态更新与屏幕刷新。通过动画循环驱动,结合对象池模式管理大量动态对象,能有效优化性能,避免频繁内存分配。双缓冲绘制技术则解决了屏幕闪烁问题,提升了视觉流畅度。这些技术在游戏开发、嵌入式系统及终端应用中具有广泛价值。本文以C/C++控制台环境下的“动态流星雨”项目为例,深入探讨了如何利用对象池和双缓冲实现高效、流畅的字符图形动画,为理解底层图形编程和性能优化提供了绝佳实践。

weixin_30470643的博客 354

C语言C++爱心代码:从控制台到图形库的彩色闪动源码实现

爱心代码是编程入门中常见的趣味实践,其核心在于通过数学公式生成心形曲线,并利用字符渲染或图形绘制在屏幕上呈现。在C语言和C++中,实现方式包括控制台字符输出与图形库像素绘制,涉及坐标映射、颜色控制和动画刷新等基础技术。这类代码不仅帮助理解循环、条件判断和数学建模,还能通过彩色闪动和动态效果提升视觉表现,适用于节日祝福、编程教学或个人练手项目。本文围绕爱心代码的源码实现,详细解析从静态字符到动态彩色闪动的完整过程,并提供可直接运行的C/C++代码示例。

weixin_33922670的博客 282

C/C++图形编程入门:EGE库安装配置与第一个窗口程序

图形编程是许多C/C++学习者从控制台走向可视化交互的第一步,但直接面对Window底层API往往令人却步。而图形库的作用,正是以更友好的接口封装底层绘图细节,让开发者专注于逻辑与画面呈现。EGE(Easy Graphics Engine)就是这样一个开源C++图形库,它在Windows GDI基础上提供简明函数,通过initgraph、fillellipse等接口,让初学者只需少量代码即可绘制窗口、图元、文字,并处理鼠标键盘事件,大幅降低入门门槛。其典型应用场景包括高校C语言课程设计、图形学教学演示以及个

weixin_34253126的博客 409

C++实现Windows全局窗口:跨虚拟桌面显示的技术解析

在Windows多任务开发中,窗口管理是基础且关键的技术点。Windows系统通过虚拟桌面机制实现了窗口的隔离与绑定,每个窗口默认被限制在创建时的桌面内。这一机制虽然保证了用户体验的一致性,但对于需要全局显示的辅助工具、监控面板等应用场景却形成了障碍。通过深入理解COM组件和系统接口,开发者可以突破这一限制,实现窗口的跨桌面显示。其中,IVirtualDesktopManager接口提供了窗口与虚拟桌面的关联管理能力,而IVirtualDesktopNotification接口则能捕获全局的桌面创建与切换事

cuxiong8996的博客 519
上一篇: C++ 单例模式
下一篇: 关于C++单例模式内存释放问题的一点点总结
linuxwuj
博客等级 码龄16年 25粉丝 29原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值