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

问题描述 投票:0回答:2

我想要某种方法来知道 Capslock 是否处于活动状态,我想我可以使用

xet
来达到此目的,使用管道,通过
popen('xset -q | grep Capslock')
我能够找出答案,但我想要某种不存在的方法在C程序中使用命令,有什么方法可以知道这一点。 在这种情况下我还想问一件事,
xset
在Linux的控制台模式下不起作用,我做alt+ctrl+f1然后登录那里,如果尝试运行
xset -q
这个会抛出错误,也许这无法与控制台中的XWindows通信,那么对于这种情况可以采取什么解决方案。

c linux keyboard x11 wayland
2个回答
2
投票

我想要某种方法来知道 Capslock 是否处于活动状态

您可能想要

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;
  
  Status ok = XkbGetIndicatorState (display, XkbUseCoreKbd, &state);

  XCloseDisplay (display);

  if (ok != Success)
    return 2;

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

或者,您可以采用 与 xset 中使用的相同方法并使用

XkbGetNamedIndicator
,这是一个更通用的函数。 (从 Linux 1.1.54 开始,指示灯和按键状态可以独立更改,但通常可以期望它们匹配。)


2
投票

将源代码下载到

xset
并查看它是如何工作的。这不是黑魔法。它将为您提供调用来获取/设置您想要的东西的函数。要使
xset
工作,必须在窗口管理器下调用它,因此无法从 VT 控制台完成。

对于 VT,从

man 2 ioctl_console

 开始,您可以使用 
KDGKBLED
KDSKBLED
 ioctl 来获取/设置标志。

© www.soinside.com 2019 - 2024. All rights reserved.