如何以编程方式检测 linux 中的大写锁定状态
How to detect the status of the capslock in linux programmatically
我想知道 Capslock 是否处于活动状态,我想我可以使用 xet
为此目的,使用管道,通过 popen('xset -q | grep Capslock')
我能够找到答案,但我想要一些不使用命令的方法,在 C 程序中,有什么方法可以知道这一点。
在这种情况下我还想问一件事,xset
在 linux 的控制台模式下不起作用,我做 alt+ ctrl+f1 然后登录那里,如果尝试 运行 xset -q
这将抛出错误,也许这无法与 XWindows 通信控制台,那么对于这种情况可以采用什么解决方案。
I want some way to know if the Capslock is active or not
您可能想要 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;
}
或者,您可以使用更通用的 same approach that is used in xset and use XkbGetNamedIndicator
函数。
将源代码下载到 xset
,看看它是如何工作的。这不是黑魔法。它会给你调用 get/set 你想要的东西的功能。要使 xset
工作,必须在 Window 管理器 下 调用它,因此不能从 VT 控制台完成。
对于 VT,从 man 2 ioctl_console
开始,您可以使用 KDGKBLED
和 KDSKBLED
ioctl 来 get/set 标志。
我想知道 Capslock 是否处于活动状态,我想我可以使用 xet
为此目的,使用管道,通过 popen('xset -q | grep Capslock')
我能够找到答案,但我想要一些不使用命令的方法,在 C 程序中,有什么方法可以知道这一点。
在这种情况下我还想问一件事,xset
在 linux 的控制台模式下不起作用,我做 alt+ ctrl+f1 然后登录那里,如果尝试 运行 xset -q
这将抛出错误,也许这无法与 XWindows 通信控制台,那么对于这种情况可以采用什么解决方案。
I want some way to know if the Capslock is active or not
您可能想要 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;
}
或者,您可以使用更通用的 same approach that is used in xset and use XkbGetNamedIndicator
函数。
将源代码下载到 xset
,看看它是如何工作的。这不是黑魔法。它会给你调用 get/set 你想要的东西的功能。要使 xset
工作,必须在 Window 管理器 下 调用它,因此不能从 VT 控制台完成。
对于 VT,从 man 2 ioctl_console
开始,您可以使用 KDGKBLED
和 KDSKBLED
ioctl 来 get/set 标志。