2016-10-15 108 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