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

实现方向键选择的控制台菜单:如何保留菜单前后的控制台输出?

控制台菜单保存与恢复输出的实现方案

针对你需要实现的「显示菜单时清空控制台、操作后恢复原有输出」的需求,以下是几种不同场景下的可行方案:

1. 操作系统原生API实现

Windows平台

利用Windows控制台API直接读写屏幕缓冲区,实现状态保存与恢复:

#include <windows.h>

int main() {
    // 获取控制台句柄与缓冲区信息
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hConsole, &csbi);

    // 分配内存保存当前屏幕内容
    CHAR_INFO* screenBuffer = new CHAR_INFO[csbi.dwSize.X * csbi.dwSize.Y];
    COORD bufferSize = csbi.dwSize;
    COORD origin = {0, 0};
    SMALL_RECT readArea = {0, 0, csbi.dwSize.X - 1, csbi.dwSize.Y - 1};
    ReadConsoleOutput(hConsole, screenBuffer, bufferSize, origin, &readArea);

    // 清空控制台并展示菜单
    system("cls");
    printf("1. 选项一\n2. 选项二\n3. 退出\n");
    printf("使用方向键选择,回车确认\n");
    // 此处添加菜单选择逻辑...

    // 恢复原有控制台输出
    WriteConsoleOutput(hConsole, screenBuffer, bufferSize, origin, &readArea);
    delete[] screenBuffer;
    return 0;
}

Linux/Unix平台

利用终端转义序列直接保存/恢复整个屏幕,无需复杂API:

import sys
import keyboard

# 保存当前屏幕状态
sys.stdout.write('\033[?1049h')
sys.stdout.flush()

# 清空屏幕并显示菜单
sys.stdout.write('\033[2J\033[H')
sys.stdout.flush()
print("=== 菜单 ===")
print("1. 功能A")
print("2. 功能B")
print("↑↓切换,回车确认")

# 模拟菜单选择逻辑(仅示例)
selected = 0
while True:
    if keyboard.is_pressed('up') and selected > 0:
        selected -= 1
        sys.stdout.write('\033[2J\033[H')
        print("=== 菜单 ===")
        print(f"{'→ 1. 功能A' if selected ==0 else '  1. 功能A'}")
        print(f"{'→ 2. 功能B' if selected ==1 else '  2. 功能B'}")
        print("↑↓切换,回车确认")
        sys.stdout.flush()
        while keyboard.is_pressed('up'):
            pass
    elif keyboard.is_pressed('down') and selected <1:
        selected +=1
        sys.stdout.write('\033[2J\033[H')
        print("=== 菜单 ===")
        print(f"{'→ 1. 功能A' if selected ==0 else '  1. 功能A'}")
        print(f"{'→ 2. 功能B' if selected ==1 else '  2. 功能B'}")
        print("↑↓切换,回车确认")
        sys.stdout.flush()
        while keyboard.is_pressed('down'):
            pass
    elif keyboard.is_pressed('enter'):
        break

# 恢复原有屏幕状态
sys.stdout.write('\033[?1049l')
sys.stdout.flush()

2. 跨平台终端UI库方案

如果需要跨平台兼容且快速开发,推荐使用成熟的终端UI库,这类库内置了屏幕状态管理:

  • ncurses(C/C++):经典终端UI库,自动处理屏幕保存与恢复,支持菜单导航
#include <ncurses.h>

int main() {
    // 初始化ncurses,自动保存当前屏幕
    initscr();
    cbreak();
    keypad(stdscr, TRUE);
    noecho();

    // 构建交互式菜单
    int choice = 0;
    const char* options[] = {"选项一", "选项二", "退出"};
    int opt_count = sizeof(options)/sizeof(options[0]);

    while(1) {
        clear();
        printw("请选择操作(方向键切换,回车确认)\n");
        for(int i=0; i<opt_count; i++){
            if(i == choice){
                attron(A_REVERSE); // 高亮选中项
                printw("→ %s\n", options[i]);
                attroff(A_REVERSE);
            } else {
                printw("  %s\n", options[i]);
            }
        }
        refresh();

        int ch = getch();
        if(ch == KEY_UP && choice >0) choice--;
        else if(ch == KEY_DOWN && choice < opt_count-1) choice++;
        else if(ch == '\n') break;
    }

    // 退出ncurses,自动恢复原有屏幕
    endwin();
    return 0;
}
  • prompt-toolkit(Python):轻量易用的交互式库,无需手动处理屏幕状态
from prompt_toolkit import prompt
from prompt_toolkit.shortcuts import radiolist_dialog

# 直接创建单选菜单,自动处理屏幕状态
result = radiolist_dialog(
    title="控制台菜单",
    text="请选择操作:",
    values=[
        ("opt1", "功能A"),
        ("opt2", "功能B"),
    ]
).run()

# 菜单关闭后自动恢复原有控制台内容
print(f"你选择了:{result}")

3. 简易文件重定向方案(无API依赖)

如果不想调用API或引入库,可以临时将控制台输出重定向到文件,操作完成后恢复:

# 保存当前控制台内容到临时文件
script -q /tmp/console_backup.txt -c "sleep 0.1"

# 清空屏幕并显示菜单
clear
echo "=== 菜单 ==="
echo "1. 执行任务A"
echo "2. 执行任务B"
read -p "输入选择:" select

# 恢复原有控制台内容
cat /tmp/console_backup.txt
rm /tmp/console_backup.txt

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:47:14