You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中实现固定大小不可更改的控制台?

嘿,这个问题我之前帮好几个做纯文本项目的开发者解决过——控制台窗口大小乱跑确实会把精心排版的文字搞乱,分平台给你说具体的实现方案:

Windows 平台(真正锁定窗口大小)

Windows 下可以通过调用系统 API 修改控制台窗口的样式,直接移除允许调整大小的边框和最大化按钮,从根源上阻止用户修改窗口尺寸。下面给你两种常用语言的实现示例:

Python 实现

import ctypes
from ctypes import wintypes

# 加载系统库
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
user32 = ctypes.WinDLL('user32', use_last_error=True)

# 定义 API 所需的类型
HWND = wintypes.HWND
LONG = wintypes.LONG
GWL_STYLE = -16
WS_THICKFRAME = 0x00040000  # 允许拖动调整大小的边框样式
WS_MAXIMIZEBOX = 0x00010000  # 最大化按钮样式

# 获取控制台窗口句柄
console_handle = kernel32.GetConsoleWindow()
if console_handle:
    # 获取当前窗口样式
    current_style = user32.GetWindowLongPtrW(console_handle, GWL_STYLE)
    # 移除可调整边框和最大化按钮
    new_style = current_style & ~(WS_THICKFRAME | WS_MAXIMIZEBOX)
    user32.SetWindowLongPtrW(console_handle, GWL_STYLE, new_style)
    
    # 配合你已掌握的方法固定窗口大小(示例为80列、25行)
    window_rect = wintypes.SMALL_RECT(0, 0, 80, 25)
    kernel32.SetConsoleWindowInfo(kernel32.GetStdHandle(-11), True, ctypes.byref(window_rect))

这段代码先拿到控制台窗口的句柄,然后修改它的样式,去掉允许调整大小的边框和最大化按钮,最后再固定窗口尺寸,用户就完全没法改大小了。

C++ 实现

#include <windows.h>

int main() {
    // 获取控制台窗口句柄
    HWND consoleHandle = GetConsoleWindow();
    if (consoleHandle) {
        // 获取当前窗口样式
        LONG windowStyle = GetWindowLongPtr(consoleHandle, GWL_STYLE);
        // 移除可调整边框和最大化按钮
        windowStyle &= ~(WS_THICKFRAME | WS_MAXIMIZEBOX);
        SetWindowLongPtr(consoleHandle, GWL_STYLE, windowStyle);
        
        // 固定窗口大小(示例为80列、25行)
        SMALL_RECT targetRect = {0, 0, 80, 25};
        SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &targetRect);
    }
    
    // 你的项目业务代码
    return 0;
}

Linux/macOS 平台(被动拦截+重置)

在 Unix-like 系统中,终端窗口的控制权属于用户的终端模拟器(比如 iTerm2、GNOME Terminal),程序没法直接修改终端的窗口样式来锁定大小。不过我们可以监听窗口大小变化的信号,一旦用户调整了尺寸,就自动把它重置回我们需要的大小:

Python 实现

import os
import signal
import fcntl
import struct
import termios

# 定义你需要固定的终端尺寸:行数、列数
TARGET_ROWS = 25
TARGET_COLS = 80

def set_terminal_size(rows, cols):
    # 调用系统接口设置终端大小
    size_struct = struct.pack("HHHH", rows, cols, 0, 0)
    fcntl.ioctl(0, termios.TIOCSWINSZ, size_struct)

def handle_resize_signal(signum, frame):
    # 当窗口大小变化时,重置回目标尺寸并提示用户
    set_terminal_size(TARGET_ROWS, TARGET_COLS)
    print("\r终端大小已锁定,请勿调整!", end="")

# 注册窗口大小变化信号的处理函数
signal.signal(signal.SIGWINCH, handle_resize_signal)

# 初始化设置终端大小
set_terminal_size(TARGET_ROWS, TARGET_COLS)

# 保持程序运行(替换成你的项目逻辑)
while True:
    pass

这段代码会监听 SIGWINCH 信号(终端窗口大小变化时系统会发送这个信号),一旦触发就自动把终端改回你设定的大小,同时给用户提示。虽然没法完全阻止用户调整,但能保证排版始终正常。

额外提示

如果你用的是其他编程语言,思路是一样的:Windows 端调用系统 API 修改窗口样式;Unix-like 端监听窗口变化信号并重置尺寸。

内容的提问来源于stack exchange,提问作者jaeho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:02:46