私の知る限り、これはルート レベルのアクセス許可のない Xlib (別名 X) なしでは実行できません。XQueryKeymap() を使用すると、必要なことが行われます。ただし、Xは使用できないと指摘しました。いずれにせよ、ディスプレイ接続を開く必要もあります。
#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);
}
これを行う方法があると思います。問題は、キーボード デバイスから直接読み取る必要があることです。端末からの入力は得られません。私も同じ問題を抱えてる。 (バックグラウンドで) 実行するプログラムがあり、ユーザーが Shift キーを押しているかどうかを知りたい.
これは可能だと思います。開始する場所は /dev/input/by-path/*-kbd
かもしれません .
このファイルは、キーが押されるたびに入力を提供するか、キーが押されている場合は定期的に入力を提供するため、一見の価値があります。 (cat /dev/input/by-path/*-kbd
を試してください )
あなたがこれを理解しているなら、私はあなたがそれをどのようにやったかを聞きたいです.
編集:解決策を見つけました
これを行う方法を理解しました。私のプログラムは次のとおりです:
#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
}
情報メッセージがありません (私は怠け者です)。ただし、基本的には最初の引数がキーのリストと比較され、適切なキー識別子が使用されます。キーが押されている場合は true を返し、押されていない場合は false を返します。
注意
キーボード デバイスの名前を変更する必要があります。デフォルトのキーボード デバイスを見つける方法がわかりません。 (ご存じでしたら、ぜひお聞きしたいです;) )
これは見事に機能します。Shift キーを押したままにすると、Xorg の自動起動を開始するために使用します。