GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich den Tastaturstatus unter Linux abrufen?

AFAIK kann dies nicht ohne Xlib (auch bekannt als X) ohne Berechtigungen auf Root-Ebene durchgeführt werden. Die Verwendung von XQueryKeymap() wird tun, was Sie wollen. Sie haben jedoch darauf hingewiesen, dass X nicht verwendet werden kann. Unabhängig davon ist auch das Öffnen der Display-Verbindung erforderlich.

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

Ich denke, es gäbe eine Möglichkeit, dies zu tun. Die Sache ist, dass Sie direkt vom Tastaturgerät lesen müssten. Sie würden keine Eingabe vom Terminal erhalten. Ich habe das gleiche Problem. Ich habe ein Programm, das (im Hintergrund) läuft, und ich möchte wissen, ob der Benutzer die Umschalttaste gedrückt hält.

Ich glaube, dass dies möglich ist, und ein Anfangspunkt könnte /dev/input/by-path/*-kbd sein .

Diese Datei gibt jedes Mal Eingaben, wenn eine Taste gedrückt wird, oder wiederholt, wenn sie gedrückt gehalten wird, so dass es einen Blick wert sein könnte. (Versuchen Sie Kat. /dev/input/by-path/*-kbd )

Wenn Sie das herausfinden, würde ich gerne hören, wie Sie es gemacht haben.

EDIT:Ich habe die Lösung gefunden

Ich habe herausgefunden, wie das geht. Mein Programm ist wie folgt:

#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

}

Die Info-Nachricht fehlt (ich bin zu faul). Aber im Wesentlichen wird das erste Argument mit einer Liste von Schlüsseln verglichen und die entsprechende Schlüsselkennung verwendet. Es gibt true zurück, wenn die Taste gedrückt wird, und false, wenn nicht.

Bitte beachten

Sie müssen den Namen des Tastaturgeräts ändern. Ich kenne keine Möglichkeit, das Standard-Tastaturgerät zu finden. (wenn du weißt, würde ich gerne hören;) )

Das funktioniert wunderbar:Ich benutze es, um den Autostart von Xorg zu starten, wenn ich die Umschalttaste gedrückt halte.


Linux
  1. So verwenden Sie den Befehl ssh-keygen unter Linux

  2. Wie erhalte ich eine Liste der verfügbaren drahtlosen Netzwerke unter Linux?

  3. Wie bekomme ich den Benutzernamen in C/C++ unter Linux?

  4. Wie erhalte ich die Anzahl der physischen Festplatten in Linux?

  5. Wie kann ich den $PATH unter Linux bearbeiten?

So erhalten Sie die Größe eines Verzeichnisses in Linux

So erhalten Sie die Größe eines Verzeichnisses in Linux

So ermitteln Sie den Verbindungsstatus eines Netzwerkkabels in Linux

So erhalten Sie den Dateinamen aus dem vollständigen Pfad in Linux

So erhalten Sie die Anzahl der Prozessoren / Kerne in Linux

Wie bekomme ich das richtige spanische Tastaturlayout?