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

2024-03-21 19:52

本文主要是介绍windows c++ 不堵塞 监听键盘输入 历史记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 keyif (!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 keystd::cout << "You entered: " << input << std::endl;input = ""; // Reset input} else if (key == '\b') { // Backspace keyif (!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 keyif (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 keyif (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;
}

尽情享受吧!!!

这篇关于windows c++ 不堵塞 监听键盘输入 历史记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/833744

相关文章

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

C/C++随机数生成的五种方法

《C/C++随机数生成的五种方法》C++作为一种古老的编程语言,其随机数生成的方法已经经历了多次的变革,早期的C++版本使用的是rand()函数和RAND_MAX常量,这种方法虽然简单,但并不总是提供... 目录C/C++ 随机数生成方法1. 使用 rand() 和 srand()2. 使用 <random

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

Windows环境下安装达梦数据库的完整步骤

《Windows环境下安装达梦数据库的完整步骤》达梦数据库的安装大致分为Windows和Linux版本,本文将以dm8企业版Windows_64位环境为例,为大家介绍一下达梦数据库的具体安装步骤吧... 目录环境介绍1 下载解压安装包2 根据安装手册安装2.1 选择语言 时区2.2 安装向导2.3 接受协议

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值