Check keypress in C++ on Linux

后端 未结 2 421
春和景丽
春和景丽 2020-12-19 07:37

Is there an easy way to check if a key is being pressed so I can loop through that in a thread? Preferred not to use a library and definitely not ncurses. There isn\'t a sin

相关标签:
2条回答
  • 2020-12-19 08:08

    I find a simpler way:

    #include <X11/Xlib.h>
    #include <iostream>
    #include "X11/keysym.h"
    
    /**
     *
     * @param ks  like XK_Shift_L, see /usr/include/X11/keysymdef.h
     * @return
     */
    bool key_is_pressed(KeySym ks) {
        Display *dpy = XOpenDisplay(":0");
        char keys_return[32];
        XQueryKeymap(dpy, keys_return);
        KeyCode kc2 = XKeysymToKeycode(dpy, ks);
        bool isPressed = !!(keys_return[kc2 >> 3] & (1 << (kc2 & 7)));
        XCloseDisplay(dpy);
        return isPressed;
    }
    
    bool ctrl_is_pressed() {
        return key_is_pressed(XK_Control_L) || key_is_pressed(XK_Control_R);
    }
    
    int main(int argc, char **argv) {
        std::cout << ctrl_is_pressed() << std::endl;
        return (0);
    };
    
    0 讨论(0)
  • 2020-12-19 08:11

    Try this:-

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <termios.h>
    
    int main()
    {
        struct termios oldSettings, newSettings;
    
        tcgetattr( fileno( stdin ), &oldSettings );
        newSettings = oldSettings;
        newSettings.c_lflag &= (~ICANON & ~ECHO);
        tcsetattr( fileno( stdin ), TCSANOW, &newSettings );    
    
        while ( 1 )
        {
            fd_set set;
            struct timeval tv;
    
            tv.tv_sec = 10;
            tv.tv_usec = 0;
    
            FD_ZERO( &set );
            FD_SET( fileno( stdin ), &set );
    
            int res = select( fileno( stdin )+1, &set, NULL, NULL, &tv );
    
            if( res > 0 )
            {
                char c;
                printf( "Input available\n" );
                read( fileno( stdin ), &c, 1 );
            }
            else if( res < 0 )
            {
                perror( "select error" );
                break;
            }
            else
            {
                printf( "Select timeout\n" );
            }
        }
    
        tcsetattr( fileno( stdin ), TCSANOW, &oldSettings );
        return 0;
    }
    

    From here

    0 讨论(0)
提交回复
热议问题