GNU/Linux >> Linux の 問題 >  >> Linux

Linuxでキーボードの状態を取得するにはどうすればよいですか?

私の知る限り、これはルート レベルのアクセス許可のない 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 の自動起動を開始するために使用します。


Linux
  1. 自動マウントのUSBキーを取得するにはどうすればよいですか?

  2. Linux の C/C++ でユーザー名を取得するには?

  3. Linux でファイルとディレクトリのサイズを確認するにはどうすればよいですか?

  1. Linux で物理ディスクの数を取得するには?

  2. Linux で $PATH を編集するにはどうすればよいですか?

  3. Linux ユーザーにとって Magic SysRq キーはどのように危険なのですか?

  1. Linux –オペレーティングシステムの名前を確実に取得するにはどうすればよいですか?

  2. Linux で ssh-keygen コマンドを使用する方法

  3. Linux で利用可能なワイヤレス ネットワークのリストを取得するにはどうすればよいですか?