C++ cin keypress event

后端 未结 4 1665
天命终不由人
天命终不由人 2021-01-05 16:47

I believe this is a very simple question, but I can\'t find a simple answer to it. I have an infinite loop, e.g. while(1), for(;;), and I need to b

相关标签:
4条回答
  • 2021-01-05 17:19

    Below is a Windows console code that uses kbhit() and has an infinite loop. But if keyboard is hit, it breaks the loop and exits. If you have <conio.h> , try this :

    #include <iostream> 
    #include <conio.h>
    
    using namespace std;
    
    
    int main()
    {
    
    
       while (1)
       { 
         if (kbhit()) break;
    
       }
    
      return 0;
    }
    
    0 讨论(0)
  • 2021-01-05 17:20

    This checks if "left arrow" is being pressed or not:

    GetKeyState(VK_LEFT)
    

    Also this does not wait for anything. Just checks some flags.

    Some other keys defined in winuser.h:

    #define VK_NUMPAD0        0x60
    #define VK_NUMPAD1        0x61
    #define VK_NUMPAD2        0x62
    #define VK_NUMPAD3        0x63
    #define VK_NUMPAD4        0x64
    #define VK_NUMPAD5        0x65
    #define VK_NUMPAD6        0x66
    #define VK_NUMPAD7        0x67
    #define VK_NUMPAD8        0x68
    #define VK_NUMPAD9        0x69
    
    #define VK_CLEAR          0x0C
    #define VK_RETURN         0x0D
    
    #define VK_SHIFT          0x10
    #define VK_CONTROL        0x11
    #define VK_MENU           0x12
    #define VK_PAUSE          0x13
    #define VK_CAPITAL        0x14
    
    #define VK_KANA           0x15
    #define VK_HANGEUL        0x15  /* old name - should be here for compatibility */
    #define VK_HANGUL         0x15
    #define VK_JUNJA          0x17
    #define VK_FINAL          0x18
    #define VK_HANJA          0x19
    #define VK_KANJI          0x19
    
    #define VK_ESCAPE         0x1B
    
    #define VK_CONVERT        0x1C
    #define VK_NONCONVERT     0x1D
    #define VK_ACCEPT         0x1E
    #define VK_MODECHANGE     0x1F
    
    #define VK_SPACE          0x20
    #define VK_PRIOR          0x21
    #define VK_NEXT           0x22
    #define VK_END            0x23
    #define VK_HOME           0x24
    #define VK_LEFT           0x25
    #define VK_UP             0x26
    #define VK_RIGHT          0x27
    #define VK_DOWN           0x28
    #define VK_SELECT         0x29
    #define VK_PRINT          0x2A
    #define VK_EXECUTE        0x2B
    #define VK_SNAPSHOT       0x2C
    #define VK_INSERT         0x2D
    #define VK_DELETE         0x2E
    #define VK_HELP           0x2F
    

    winuser.h must be included in windows.h

    0 讨论(0)
  • 2021-01-05 17:26

    There is no "keyboard" in C++. You only have an opaque input data stream which your terminal popu­lates occasionally with its own keyboard input. This is almost always a buffered, editable line-wise input, so you have no way of knowing when any given key was pressed.

    You need a platform-specific method to communicate directly with your terminal on a lower level. One such library, fairly wide-spread and portable, is ncurses (a compatible Windows variant exists). Portable graphical application frameworks such as SDL and Allegro also provide raw keyboard handling.

    0 讨论(0)
  • 2021-01-05 17:35

    Well, what you want is asynchronous input. All of the methods provided by cin wait for enter. You will have to use system-specific functions for that, or use a library that will do it for you.

    What you need to do is to not only process your logic in a while loop, but also listen from message pipe from your OS. If you want some more information about that one, please drop a comment.

    EDIT: There's one other way, but I wouldn't recommend it as it can be non-portable I believe. The following code compiles and runs under VS2012RC.

    #include<iostream>
    #include<conio.h>
    
    using namespace std;
    
    int main()
    {
       cout << "Enter a character";
       getch();
    }
    
    0 讨论(0)
提交回复
热议问题