2016-10-15 105 views
0

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

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

我已经试过低于:

随着Console::KeyAvailable:与_kbhit()

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); 

更新代码(仍然没有工作)

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"); 
    } 
} 
+0

是否有keyUp事件可用? –

回答

0

如果你改变环路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 
    } 
} 

也许添加某种睡眠或有东西的,所以每当被处理的按键,而不是在键盘缓冲区但你的程序并不总是发送停止。

0

我会建议使用事件listenr机能的研究一样_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); 

此代码应更好地工作

+0

我用_kbhit添加了代码,但仍然不起作用。你可以看看它说错了吗? – Goliat

+0

我会建议通过_getch()初始化一个变量。并将其用作其他语句的条件,并且每次要清除缓冲区时将其值更改为0,我希望它能正常工作 –

+0

请尝试使用以下代码: {int key; 而(_kbhit()){ '键=的getch();' 如果(cki.Key == ConsoleKey :: UPARROW) {//发送消息向前} } 键= 0; (key) {//发送消息停止} } while(cki.Key!= ConsoleKey :: Escape);' –

0

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

+0

我需要包括的东西,所以我可以使用_kbhit()? – Goliat

+0

我试过了,它不工作这是我的代码的一部分: – Goliat

+0

我试过了它不工作这是我的我的代码部分:' \t \t \t \t \t \t做{ \t \t \t如果(cki.Key == ConsoleKey :: UPARROW) \t \t \t { \t \t \t \t //发送消息 \t \t \t} \t \t \t否则如果(_kbhit()== FALSE) \t \t \t { \t \t \t \t //发送代码,以停止 \t \t \t} \t \t \t while(_kbhit())getch(); \t \t} while(cki.Key!= ConsoleKey :: Escape); \t \t \t \t' – Goliat