如何在Linux中以编程方式检测大写锁定键的状态

3
我想找到一种方法来判断Capslock是否处于激活状态,我想使用xet来实现这个目的。通过使用pipe,popen('xset -q | grep Capslock') ,我可以找到结果,但我想知道在C程序中有没有不使用命令的方法来知道此信息。还有一件事我想问,在这种情况下,xset 在Linux的控制台模式下不起作用。我按 alt+ctrl+f1 然后登录,如果尝试运行 xset -q 将会抛出错误,可能无法在控制台中与XWindows通信,那么这种情况的解决方案是什么?
2个回答

2
我希望知道如何判断大写锁定键是否开启。
你可能需要使用XkbGetIndicatorState函数。例如:
#include <stdio.h>
#include <stdlib.h>
#include <X11/XKBlib.h>

/* Compile this with -lX11 */

int main ()
{
  Display *display;
  Status status;
  unsigned state;

  display = XOpenDisplay (getenv ("DISPLAY"));
  if (!display)
    return 1;

  if (XkbGetIndicatorState (display, XkbUseCoreKbd, &state) != Success)
    return 2;

  printf ("Caps Lock is %s\n", (state & 1) ? "on" : "off");
  return 0;
}

或者,您可以采用xset中使用的相同方法,并使用XkbGetNamedIndicator,这是一种更通用的函数。


1
下载 xset 的源代码,了解它的工作原理。这并不是黑魔法,它将提供给你调用以获取/设置所需内容的函数。要让 xset 正常工作,必须在窗口管理器下调用它,因此无法从 VT 控制台执行。

对于 VT,请参阅 man 2 ioctl_console,可以使用 KDGKBLEDKDSKBLED ioctls 来获取/设置标志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接