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

C++控制台应用菜单选项选中状态实时显示功能实现问询

以下是可直接运行的实现代码,完全匹配你需要的功能:

#include <iostream>
#include <Windows.h>

int main()
{
    // 存储各选项状态,false=OFF,true=ON
    bool appStatus = false;
    bool optionStates[8] = {false}; // 对应NUMPAD1到NUMPAD8的8个选项

    while (true)
    {
        // 清屏,准备重绘菜单
        system("cls");

        // 绘制菜单布局
        std::cout << "--------------------------------------------------\n";
        std::cout << "                  Console Menu                    \n";
        std::cout << "               Subtitle for Menu                  \n";
        std::cout << "--------------------------------------------------\n";

        std::cout << "\nAuthor: John Doe\n";
        // 动态输出状态
        std::cout << "APP STATUS:\t\t\t->" << (appStatus ? "ON" : "OFF") << "<-\n";
        std::cout << "[NUMPAD1] Option 1\t\t->" << (optionStates[0] ? "ON" : "OFF") << "<-\n";
        std::cout << "[NUMPAD2] Option 2\t\t->" << (optionStates[1] ? "ON" : "OFF") << "<-\n";
        std::cout << "[NUMPAD3] Option 3\t\t->" << (optionStates[2] ? "ON" : "OFF") << "<-\n";
        std::cout << "[NUMPAD4] Option 4\t\t->" << (optionStates[3] ? "ON" : "OFF") << "<-\n";
        std::cout << "[NUMPAD5] Option 5\t\t->" << (optionStates[4] ? "ON" : "OFF") << "<-\n";
        std::cout << "[NUMPAD6] Option 6\t\t->" << (optionStates[5] ? "ON" : "OFF") << "<-\n";
        std::cout << "[NUMPAD7] Option 7\t\t->" << (optionStates[6] ? "ON" : "OFF") << "<-\n";
        std::cout << "[NUMPAD8] Option 8\t\t->" << (optionStates[7] ? "ON" : "OFF") << "<-\n";
        std::cout << "[INSERT]  Exit\n";
        std::cout << "--------------------------------------------------\n";

        // 按键检测逻辑
        // 小键盘1到8对应切换选项1到8
        if (GetAsyncKeyState(VK_NUMPAD1) & 0x8000) {
            optionStates[0] = !optionStates[0];
            Sleep(200); // 防抖,避免单次按压触发多次切换
        }
        if (GetAsyncKeyState(VK_NUMPAD2) & 0x8000) {
            optionStates[1] = !optionStates[1];
            Sleep(200);
        }
        if (GetAsyncKeyState(VK_NUMPAD3) & 0x8000) {
            optionStates[2] = !optionStates[2];
            Sleep(200);
        }
        if (GetAsyncKeyState(VK_NUMPAD4) & 0x8000) {
            optionStates[3] = !optionStates[3];
            Sleep(200);
        }
        if (GetAsyncKeyState(VK_NUMPAD5) & 0x8000) {
            optionStates[4] = !optionStates[4];
            Sleep(200);
        }
        if (GetAsyncKeyState(VK_NUMPAD6) & 0x8000) {
            optionStates[5] = !optionStates[5];
            Sleep(200);
        }
        if (GetAsyncKeyState(VK_NUMPAD7) & 0x8000) {
            optionStates[6] = !optionStates[6];
            Sleep(200);
        }
        if (GetAsyncKeyState(VK_NUMPAD8) & 0x8000) {
            optionStates[7] = !optionStates[7];
            Sleep(200);
        }
        // 按INSERT退出
        if (GetAsyncKeyState(VK_INSERT) & 0x8000) {
            break;
        }

        // 降低循环占用,不用一直满速跑
        Sleep(10);
    }
    return 0;
}

实现说明

  • 状态存储:用bool类型变量存储APP总状态,bool数组存储8个功能选项的开关状态,初始默认都为OFF
  • 动态渲染:采用「清屏+重绘」的逻辑,每次循环先清空当前控制台内容,再根据最新的状态值重新绘制完整菜单,通过三目运算符条件 ? 真值 : 假值动态切换ON/OFF显示
  • 按键监听:使用Windows原生API GetAsyncKeyState 异步检测按键状态,返回值和0x8000做与运算为真时表示对应按键处于按下状态,此时翻转对应状态变量即可
  • 防抖处理:每次检测到按键触发后调用Sleep(200),避免单次按键被识别为多次触发;循环末尾加10ms延迟降低CPU占用
  • 注意:本实现仅适用于Windows平台,依赖Windows.h提供的虚拟键码定义和API接口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:54:03