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.