如何在Linux中获取键盘状态?

我想检查用户在程序启动时是否按下了SHIFT键。 (也就是说,在程序启动前按下SHIFT键)这是一个简单的控制台程序,与X无关。

这可能类似于Win32 GetKeyboardState()函数。

我想知道我是否可以做到这一点,怎么做,但没有直接访问terminal的优点和缺点。

Solutions Collecting From Web of "如何在Linux中获取键盘状态?"

你不能。

切换键不被视为字符键,所以即使直接访问终端,您也无法检测到该键。

也许你不应该。 想象一下,例如,您正在使用美式键盘,其中可以在没有修饰符的情况下访问数字,也可以检查换档键。 其他键盘布局的人可能不得不使用shift修饰符来访问数字。 如果你的程序对这个按键有反应,那么你的程序基本上是不可用的。 同样的事情适用于其他修饰键:只有在正常的字符键被按下后才能检测到其中的一些。 或者更糟的是,他们可能需要使用shift键来使用“enter”来运行你的程序。

另外,你想监视什么换挡键? 在本地机器上,还是在用户所在的位置? 请记住,SSH存在并且通常用于远程访问伪终端。

如果您是root用户,并且希望监视本地计算机上的Shift键,则可以阅读evdev设备以查看有关Shift键的事件。 但是这只能通过自动键重复来实现,所以在运行程序之前,您将不会检测到正确按下的shift键,而只是在几秒之前。

当然,你不能在远程机器上这样做,这将是一个安全漏洞。

无论如何,你为什么要这样做呢? X的应用程序是不是正确的事情在你的情况下做?

我认为会有办法做到这一点。 问题是,你将不得不直接从键盘设备阅读。 你不会从终端获得输入。 我也有同样的问题。 我有一个运行的程序(在后台),我想知道用户是否按住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 } 

信息消息是缺乏(我太lasy)。 但基本上第一个参数是与一个键列表进行比较,并使用适当的关键字idetifyer。 如果键被按下,则返回true,否则返回false。

请注意

您将需要更改他们的键盘设备的名称。 我不知道找到默认键盘设备的方法。 (如果你知道我会喜欢听);)

这很好用,我用它来启动Xorg的自动启动,如果我按住shift键的话。

我已经通过gtk / gdk找到了一个非常简单的方法。

 int main ( int argc, char *argv[], char *env[] ) { gtk_init(&argc, &argv); GdkModifierType button_state; gdk_window_get_pointer(NULL, NULL, NULL, &button_state); if(button_state & GDK_CONTROL_MASK) { printf("ctrl key is pressed"); } }