アプリケーションで作業していて、キーボードからキーを押した場合、ソースアプリケーションの名前を含むそのキー(または文字列)を、C、GNU / LINUX、ユーザーランド、X Windowなしでキャプチャするにはどうすればよいですか?
4 に答える
X Window がなければ、この問題はさらに難しくなります。
キーストローク部分については、これと同様のコードを使用できますが、読み取り中の引数としてデバイスを渡す必要があります (キーボード、通常は/dev/input/event0 )
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd;
if(argc < 2) {
printf("usage: %s <device>\n", argv[0]);
return 1;
}
fd = open(argv[1], O_RDONLY);
struct input_event ev;
while (1)
{
read(fd, &ev, sizeof(struct input_event));
if(ev.type == 1)
printf("key %i state %i\n", ev.code, ev.value);
}
}
クレジットは私には行きません。このコードは、キーストロークを取得するための Ventriloctrl ハック ( http://public.callutheran.edu/~abarker/ventriloctrl-0.4.tar.gz ) から取得したものです。
/dev/input 内のファイルの 1 つからデータを読み取ることができます。どちらがシステムに依存します。/dev/input/event0 または /dev/input/by-path/platform-i8042-serio-0-event-kbd などの可能性があります。形式は、カーネル ヘッダーの input.h で指定されます。それは
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
実行できます
od -tx2 FILENAME
何かを入力して、何が起こるかを確認します。
どのアプリケーションがキー イベントを受信したかについては、よくわかりません。どちらがメイン tty から読み取っているのかを確認してみてください。
1 つの可能性: 「 sudosh」、「sudo シェル」 (または、しばらく変更されていないため、その代替の 1 つ。Google はあなたの友達です)のソースを見つけて調べてください。
疑似 tty をいじり、情報をファイルに記録することによって、すべての入力と出力を追跡します。
それがあなたにとって十分に正確であるかどうかは、おそらくもっと議論の余地があります。すべてのアプリケーションのすべてのキーストロークを記録します。また、X11でどのように機能するかはわかりません-X11で機能するかどうか。