检查是否没有按键被按下

check if no key is pressed

我正在制作一个 CLR 控制台应用程序来控制机器人。我正在使用 cki.Key == ConsoleKey::UpArrow 检查按钮是否被按下,然后向机器人发送消息。我想在没有按键时停止机器人。我如何知道是否没有按键被按下?

我正在尝试 Console::KeyAvailable == false,但我需要按另一个按钮来停止机器人。

我试过的如下:

Console::KeyAvailable:

ConsoleKeyInfo cki;
do{ 
    cki = Console::ReadKey(true);
    if (cki.Key == ConsoleKey::UpArrow) 
    { /* send message forward*/ }
    else if (Console::KeyAvailable == false) 
    { /* send message STOP*/ }

}while (cki.Key != ConsoleKey::Escape);

使用 _kbhit() 更新代码(仍然无效):

ConsoleKeyInfo cki;
do{ 
    cki = Console::ReadKey(true);
    if (cki.Key == ConsoleKey::UpArrow) 
    { /* send message forward*/ }
    else if (_kbhit() == false) 
    { /* send message STOP */ }

    while (_kbhit())
        getch();

}while (cki.Key != ConsoleKey::Escape);

新创意:

while (true)
{                       
    if (Console::KeyAvailable==1)
    {
        cki = Console::ReadKey(true);
        if (cki.Key == ConsoleKey::UpArrow)
        {
            Console::WriteLine("Forward");
        }
        if (cki.Key == ConsoleKey::Escape)
        {
            Console::WriteLine("Escape");
            break:
        }       
    }
    else
    {
        Console::WriteLine("STOP");
    }
}

我建议使用像 _kbhit 这样的事件侦听器功能,它可以检查何时按下按键以及何时释放按键,并且可以用作您要发送的信号类型的条件。您需要包括:conio.h 这应该会更好:

do{ 
    int key;
    if (_kbhit())
        key = getch();
    else
        key = 0;
    if (key==72)
    {
        // send message forward
    }
    else if (key=0) 
    {
        // send message STOP
    }
}while (cki.Key != ConsoleKey::Escape);

此代码应该可以更好地工作

您可以在 C++ 中使用 _kbhit() 函数。如果按下任何键,_kbhit 等于 1。您必须清除 _kbhit 缓冲区,否则它将保持为 1。清除方法是 character = getch();这将以字符形式保存最后输入的键,您可以比较并决定对哪个键执行哪个操作。

如果将循环更改为 while (true) 并在内部循环中使用 Console::KeyAvailable 检查密钥是否可用,如果密钥不可用,则停止发送消息,如果可用,则读取密钥并检查它是哪个密钥,如果它是 UpArrow,则转发消息。如果是Escape,则跳出循环

ConsoleKeyInfo cki;
while (true){

    if (Console::KeyAvailable){
        cki = Console::ReadKey(true);
        if (cki.Key == ConsoleKey::UpArrow){
            // Forward
        }
        else if (cki.Key == ConsoleKey::Escape){
            break;
        }
    }
    else{
        // Stop
    }   
}

并且可能会在那里添加某种睡眠或其他东西,因此您的程序并不总是在处理按下的键并且不在键盘缓冲区中时发送停止。