在C / C ++中捕获GNU / Linux中的击键

如果我在一个应用程序中工作,我按键盘上的键,我怎么可以捕捉该键(或string),包括源代码的应用程序的名称,在GNU / LINUX下,在用户空间C,没有X11 🙂

谢谢。

Solutions Collecting From Web of "在C / C ++中捕获GNU / Linux中的击键"

那么,没有X11这个问题就更困难了。
对于按键部分,您可以使用类似于此的代码,但必须将您正在读取的设备(键盘,通常是/ 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中的某个文件读取数据。 哪一个取决于你的系统。 它可能是/ 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读取。

一种可能性:查找“ sudosh ”,“sudo shell”(或其一个替代品,因为这个替代品一段时间没有被修改; Google是你的朋友)的来源。

它与伪ttys混淆,并跟踪所有的输入和输出也记录到文件的信息。

这对你来说是否足够精确可能更具争议性。 它会记录所有应用程序的所有击键。 我也不确定它如何与X11一起工作 – 如果它适用于X11。

举一个很好的例子,看看showkey的代码。

特别是,这里是主循环。 它所做的只是获取终端,复制它,将复制的复制到原始模式,直到给出“退出”或“中断”按键序列,它仅打印出给终端的密钥。

 /* * showkey.c -- display cooked key sequences * * Invoke this (no arguments needed) to see keycap-to-keystrokes mappings. * * by Eric S. Raymond <esr@snark.thyrsus.com>, 1 Nov 88 * - fix for little-endian machines (version 1.1), 21 Oct 1996. * - cleanup and modern packaging (version 1.2), 1 Aug 2002. * - changed to use termios (version 1.3), 26 Aug 2002. * See the RPM spec file changelog for more recent stuff. */ #include <stdio.h> #include <termios.h> #include <signal.h> #include <string.h> #include <stdbool.h> static int signalled; // ... main() { struct termios cooked, raw; unsigned char c; unsigned int i, timeouts; char intrchar[32], quitchar[32]; for (i = SIGHUP; i <= SIGIO; i++) (void) signal(c, catcher); // Get the state of the tty (void) tcgetattr(0, &cooked); // Make a copy we can mess with (void) memcpy(&raw, &cooked, sizeof(struct termios)); // Turn off echoing, linebuffering, and special-character processing, // but not the SIGINT or SIGQUIT keys. raw.c_lflag &=~ (ICANON | ECHO); // Ship the raw control blts (void) tcsetattr(0, TCSANOW, &raw); (void) printf("Type any key to see the sequence it sends.\n"); visualize(raw.c_cc[VINTR], intrchar); visualize(raw.c_cc[VQUIT], quitchar); (void) printf("Terminate with your shell interrupt %s or quit %s character.\n", intrchar, quitchar); signalled = 0; while (!signalled) { char cbuf[32]; read(0, &c, 1); visualize(c, cbuf); (void)fputs(cbuf, stdout); (void) fflush(stdout); } (void) printf("\nBye...\n"); // Restore the cooked state (void) tcsetattr(0, TCSANOW, &cooked); }