在未按enter确认的情况下读取组合

Reading a combination without confirming with enter?

本文关键字:情况下 读取 组合 确认 enter      更新时间:2023-10-16

所以基本上,我只想从用户那里读取字符,并使我的代码知道,当用户键入一个定义的组合(例如,CTRL+F -但不与Enter确认)时,它是输入的结束。我该怎么做呢?我只知道如何读取输入字符并比较它们的ASCII值…

编辑再看一遍你的问题,我发现我误解了你的问题。我把它放在这里,因为它可能对你或其他人仍然有用。


你所要求的与读取字符没有太大关系。实际上,CTRL根本就不是一个字符。你只需要检查按键是否按下。处理这类输入依赖于平台,即使在单个平台上,也会存在多个方法。在windows上实现它的一种方法是使用GetAsyncKeyState。此函数将检查当前是否正在按下指定的键。请注意,它不会"记住"输入,因此您必须每秒多次检查此函数以注册所有用户输入。

为函数提供一个参数,指定要检查状态的键。所有关键代码的列表可以在这里找到

的例子:

#include <iostream> //for output
#include <windows.h> //for GetAsyncKeyState
int main()
{
    while(true)
    {
        if( GetAsyncKeyState(VK_CONTROL) ) //CTRL-key is pressed
        {
            if( GetAsyncKeyState( 0x46 ) ) //F-key is pressed
                std::cout << "CTRL-F is pressed" << std::endl;
            if( GetAsyncKeyState( 0x58 ) ) //X-key is pressed
                break;
        }
    }
    std::cout << "CTRL-X was pressed, stopping.." << std::endl;
}

此示例将持续检查CTRL-F是否被按下,如果是,则写入输出,直到CTRL-X被按下。

Windows系统调用ReadConsoleInput允许您直接读取控制台输入。您可能希望将该调用包装到一个函数中,该函数仅从ReadConsoleInput函数的几个参数中提取基本数据。您可以使用GetNumberOfConsoleInputEvents编写一个函数来检查是否有任何输入。

try

#include <conio.h>
#include <iostream>
using namespace std;
int main()
{
     bool keepGoing = true;
     char key = ' ';
     while (keepGoing){
       cout << "Enter a key" << endl;
       while(_kbhit()){
         key = _getch();
         cout << "You entered: " << key << endl;
       }
     }
}

然后在结束循环时指定分隔符。

如果在Linux上诅咒是可用的。还有一个getch函数。如果您的目标是跨平台兼容性,则应该使用诅咒。Ncurses库函数与conio.h中的函数类似。ncurses教程

相关文章: