GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu získat stav klávesnice v Linuxu?

AFAIK to nelze provést bez Xlib (aka. X) bez oprávnění na kořenové úrovni. Použití XQueryKeymap() udělá to, co chcete. nicméně jste poukázali na to, že X nelze použít. Bez ohledu na to bude také vyžadováno otevření připojení displeje.

#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <stdbool.h>
#include <stdio.h>

int main()
{
    Display* dpy = XOpenDisplay(NULL);
    char keys_return[32];
    XQueryKeymap( dpy, keys_return );
    KeyCode kc2 = XKeysymToKeycode( dpy, XK_Shift_L );
    bool bShiftPressed = !!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) );
    printf("Shift is %spressed\n", bShiftPressed ? "" : "not ");
    XCloseDisplay(dpy);
}

Myslím, že by existoval způsob, jak to udělat. Jde o to, že byste museli číst přímo z klávesnice zařízení. Nedostávali byste vstup z terminálu. Mám stejný problém. Mám program, který běží (na pozadí) a chci vědět, jestli uživatel drží klávesu Shift.

Věřím, že je to možné a místo, kde začít, může být /dev/input/by-path/*-kbd .

Tento soubor poskytuje vstup pokaždé, když je klávesa stisknuta nebo opakovaně, pokud je podržena, takže by to mohlo stát za zhlédnutí. (Zkuste kočku /dev/input/by-path/*-kbd )

Pokud na to přijdete, rád bych slyšel, jak jste to udělal.

EDIT:Našel jsem řešení

Přišel jsem na to, jak to udělat. Můj program je následující:

#include <stdlib.h>
#include <stdio.h>

#include <linux/input.h>

void usage ( int argc, char *argv[] )
{
    printf("Usage:\n\t%s key\n\nvalid keys are:\n\tlshift\t- Left Shift key\n" , argv[0]);

    exit(EXIT_FAILURE);
}

int main ( int argc, char *argv[], char *env[] )
{
    if ( argc != 2 )    usage(argc, argv);

    int key;

    if ( strcmp(argv[1], "lshift") == 0 )       key = KEY_LEFTSHIFT;
    else if ( strcmp(argv[1], "rshift") == 0 )  key = KEY_RIGHTSHIFT;
    else if ( strcmp(argv[1], "lalt") == 0 )    key = KEY_LEFTALT;
    else if ( strcmp(argv[1], "ralt") == 0 )    key = KEY_RIGHTALT;
    else if ( strcmp(argv[1], "lctrl") == 0 )   key = KEY_LEFTCTRL;
    else if ( strcmp(argv[1], "rctrl") == 0 )   key = KEY_RIGHTCTRL;


    FILE *kbd = fopen("/dev/input/by-path/platform-i8042-serio-0-event-kbd", "r");

    char key_map[KEY_MAX/8 + 1];    //  Create a byte array the size of the number of keys

    memset(key_map, 0, sizeof(key_map));    //  Initate the array to zero's
    ioctl(fileno(kbd), EVIOCGKEY(sizeof(key_map)), key_map);    //  Fill the keymap with the current keyboard state

    int keyb = key_map[key/8];  //  The key we want (and the seven others arround it)
    int mask = 1 << (key % 8);  //  Put a one in the same column as out key state will be in;

    return !(keyb & mask);  //  Returns true if pressed otherwise false

}

Chybí informační zpráva (jsem líná). V zásadě se však první argument porovná se seznamem klíčů a použije se příslušný identifikátor klíče. Vrací hodnotu true, pokud je klávesa stisknuta, a false, pokud ne.

Poznámka

Budete muset změnit název zařízení s klávesnicí. Nevím o způsobu, jak najít výchozí klávesnici. (pokud víte, rád si to poslechnu;) )

Funguje to krásně:používám to ke spuštění automatického spuštění Xorg, když podržím klávesu Shift.


Linux
  1. Jak používat příkaz ssh-keygen v Linuxu

  2. Jak mohu vidět velikost souborů a adresářů v linuxu?

  3. Jak mohu získat informace o kontejneru Docker Linux ze samotného kontejneru?

  1. Jak získat počet fyzických disků v Linuxu?

  2. Jak mohu upravit $PATH na linuxu?

  3. Jak deaktivovat klávesu klávesnice v Linuxu (Ubuntu)?

  1. Linux – jak spolehlivě získat název operačního systému?

  2. Jak může být klíč Magic SysRq nebezpečný pro uživatele linuxu?

  3. Jak získat fyzickou velikost souboru v Linuxu?