我想要某种方法来知道 Capslock 是否处于活动状态,我想我可以使用
xet
来达到此目的,使用管道,通过 popen('xset -q | grep Capslock')
我能够找出答案,但我想要某种不存在的方法在C程序中使用命令,有什么方法可以知道这一点。
在这种情况下我还想问一件事,xset
在Linux的控制台模式下不起作用,我做alt+ctrl+f1然后登录那里,如果尝试运行xset -q
这个会抛出错误,也许这无法与控制台中的XWindows通信,那么对于这种情况可以采取什么解决方案。
我想要某种方法来知道 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 开始,指示灯和按键状态可以独立更改,但通常可以期望它们匹配。)
将源代码下载到
xset
并查看它是如何工作的。这不是黑魔法。它将为您提供调用来获取/设置您想要的东西的函数。要使 xset
工作,必须在窗口管理器下调用它,因此无法从 VT 控制台完成。
对于 VT,从 man 2 ioctl_console
开始,您可以使用
KDGKBLED
和
KDSKBLED
ioctl 来获取/设置标志。