我想要一些方法来了解Capslock是否有效,我认为我可以使用xet
来实现此目的,使用管道,popen('xset -q | grep Capslock')
我能够找到,但我想要一些没有使用命令的方法,在C程序中,有任何方法可以知道这一点。
在这个上下文中我想要问的另一件事,xset
在Linux的控制台模式下工作,我做 alt + ctrl + < kbd> f1 然后在那里登录,如果尝试运行xset -q
,这将抛出错误,也许这不能在控制台中与XWindows通信,所以对于这种情况可以采用什么解决方案。
答案 0 :(得分:0)
我想知道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;
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并使用XkbGetNamedIndicator
这是一个更通用的功能。
答案 1 :(得分:0)
将源代码下载到xset
,看看它是如何做到的。这不是黑魔法。它将为您提供调用以获取/设置所需内容的功能。要使xset
起作用,必须在窗口管理器下调用,因此无法从VT控制台完成。
对于VT,来自man 2 ioctl_console
,您可以使用KDGKBLED
和KDSKBLED
ioctl来获取/设置标记。
答案 2 :(得分:-1)
#include <stdio.h>
#include <Windows.h>
void CheckKeyState(){
if ((GetKeyState(VK_CAPITAL) & 0x0001)!=0)
{printf("Caps Lock ON");}
else
{printf("Caps Lock OFF");}
}
int main (void){
CheckKeyState();
}
虽然我不知道它是否在Linux下运行