GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa mendapatkan status keyboard di Linux?

AFAIK ini tidak dapat dilakukan tanpa Xlib (alias.X) tanpa izin level root. Menggunakan XQueryKeymap() akan melakukan apa yang Anda inginkan. namun Anda menunjukkan bahwa X tidak dapat digunakan. Terlepas dari itu, membuka sambungan layar juga akan diperlukan.

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

Saya pikir akan ada cara untuk melakukan ini. Masalahnya adalah Anda harus membaca langsung dari perangkat keyboard. Anda tidak akan mendapatkan masukan dari terminal. Saya memiliki masalah yang sama. Saya memiliki program yang berjalan (di latar belakang) dan saya ingin tahu apakah pengguna menahan tombol shift.

Saya yakin ini mungkin dan tempat untuk memulai mungkin /dev/input/by-path/*-kbd .

File ini memberikan input setiap kali tombol ditekan atau berulang kali jika ditekan sehingga mungkin layak untuk dilihat. (Coba cat /dev/input/by-path/*-kbd )

Jika Anda mengetahuinya, saya ingin mendengar bagaimana Anda melakukannya.

EDIT:Saya telah menemukan solusinya

Saya telah menemukan cara melakukan ini. Program saya adalah sebagai berikut:

#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

}

Pesan infonya kurang (saya terlalu malas). Tapi pada dasarnya argumen pertama dibandingkan dengan daftar kunci dan pengidentifikasi kunci yang sesuai digunakan. Mengembalikan true jika tombol ditekan dan false jika tidak.

Harap Diperhatikan

Anda perlu mengubah nama perangkat keyboard mereka. Saya tidak tahu cara menemukan perangkat keyboard default. (jika Anda tahu saya akan senang mendengar;) )

Ini berfungsi dengan baik:Saya menggunakannya untuk memulai autostart Xorg jika saya menahan tombol shift.


Linux
  1. Linux – Bagaimana Cara Mendapatkan Nama Sistem Operasi yang Andal?

  2. Cara menggunakan Perintah ssh-keygen di Linux

  3. Bagaimana saya bisa mendapatkan daftar jaringan nirkabel yang tersedia di Linux?

  1. Bagaimana cara mendapatkan jumlah CPU di Linux menggunakan C?

  2. Bagaimana cara mendapatkan nama pengguna di C/C++ di Linux?

  3. Bagaimana saya bisa melihat ukuran file dan direktori di linux?

  1. Bagaimana saya bisa mengedit $PATH di linux?

  2. Bagaimana cara menonaktifkan tombol keyboard di Linux (Ubuntu)?

  3. Bagaimana kunci Magic SysRq bisa berbahaya bagi pengguna linux?