windows c++ 不堵塞 监听键盘输入 历史记录

27 篇文章 0 订阅
16 篇文章 0 订阅

windows c++ 不堵塞 监听键盘输入 支持修改已经输入的内容,并且记录最近30条记录,多了覆盖,通过上下方向按键来显示历史记录

代码如下:

#include <iostream>
#include <windows.h>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> history;
    int historyIndex = -1;
    std::string input = "";
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
    SetConsoleMode(hInput, ENABLE_WINDOW_INPUT);

    while (true) {
        DWORD numEvents;
        INPUT_RECORD irInBuf[128];
        DWORD numEventsRead;

        if (GetNumberOfConsoleInputEvents(hInput, &numEvents) && numEvents > 0) {
            ReadConsoleInput(hInput, irInBuf, 128, &numEventsRead);

            for (DWORD i = 0; i < numEventsRead; i++) {
                if (irInBuf[i].EventType == KEY_EVENT && irInBuf[i].Event.KeyEvent.bKeyDown) {
                    char key = irInBuf[i].Event.KeyEvent.uChar.AsciiChar;
                    if (key == '\r') { // Enter key
                        if (!input.empty()) {
                            history.insert(history.begin(), input);
                            if (history.size() > 30) {
                                history.pop_back();
                            }
                        }
                        historyIndex = -1;
                        std::cout << std::endl; // Move to a new line after Enter key
                        std::cout << "You entered: " << input << std::endl;
                        input = ""; // Reset input
                    } else if (key == '\b') { // Backspace key
                        if (!input.empty()) {
                            input.pop_back();
                            std::cout << "\b \b"; // Move cursor back and erase character
                        }
                    } else if (irInBuf[i].Event.KeyEvent.wVirtualKeyCode == VK_UP) { // Up arrow key
                        if (historyIndex < static_cast<int>(history.size()) - 1) {
                            historyIndex++;
                            input = history[historyIndex];
                            std::cout << "\r" << std::string(input.length(), ' ') << "\r" << input; // Clear and print new input
                        }
                    } else if (irInBuf[i].Event.KeyEvent.wVirtualKeyCode == VK_DOWN) { // Down arrow key
                        if (historyIndex >= 0) {
                            historyIndex--;
                            input = historyIndex >= 0 ? history[historyIndex] : "";
                            std::cout << "\r" << std::string(input.length(), ' ') << "\r" << input; // Clear and print new input
                        }
                    } else {
                        input += key;
                        std::cout << key; // Print the entered character
                    }
                    std::cout.flush(); // Flush the output to show in real-time
                }
            }
        }
    }

    return 0;
}

尽情享受吧!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值