如何以编程方式检测linux中的capslock状态

时间:2018-03-29 16:59:50

标签: c linux keyboard x11 wayland

我想要一些方法来了解Capslock是否有效,我认为我可以使用xet来实现此目的,使用管道,popen('xset -q | grep Capslock')我能够找到,但我想要一些没有使用命令的方法,在C程序中,有任何方法可以知道这一点。 在这个上下文中我想要问的另一件事,xset在Linux的控制台模式下工作,我做 alt + ctrl + < kbd> f1 然后在那里登录,如果尝试运行xset -q,这将抛出错误,也许这不能在控制台中与XWindows通信,所以对于这种情况可以采用什么解决方案。

3 个答案:

答案 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,您可以使用KDGKBLEDKDSKBLED 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下运行

所以,试试这里: using GetKeyState(VK_CAPITAL) & 1 in linux