如何使用C/ c++获得num锁状态

How to get a num lock state using C/C++?

本文关键字:num 状态 获得 c++ 何使用      更新时间:2023-10-16

我读过Gdk论坛链接,上面说从3.0版开始实现num锁定状态api。但我使用的是2.4版本,我不能更新到3.0版本,因为我需要支持较低的Linux版本。这是讨论链接:

http://mail.gnome.org/archives/commits-list/2010-July/msg00259.html

所以,有没有其他的方法来获得num锁状态使用内部Linux命令?

问候,iSight

获取NumLock状态的示例代码。设foo.c

#include <stdio.h>
#include <X11/Xlib.h>
int main(void) {  
   Display *dpy = XOpenDisplay(":0"); 
   XKeyboardState x;
   XGetKeyboardControl(dpy, &x);
   XCloseDisplay(dpy);
   printf("led_mask=%lxn", x.led_mask);
   printf("NumLock is %sn", (x.led_mask & 2) ? "On" : "Off");
   return 0;
}

在戴尔笔记本电脑上使用CentOS 5进行测试后:

gcc foo.c -o foo -lX11
foo
led_mask=2
NumLock is On

或者你可以用popen("xset q | grep LED");做点什么。

掩码的第二位对于NumLock来说是相当常见的,但我不相信它是有保证的。

原始答案:一个好的起点是xev,可使用约20年:

   xev

您可以通过:

解码关键事件
foobar (XKeyEvent *bar) {
   char dummy[20];
   KeySym key;
   KeySym keyKeypad;
   XLookupString(bar, dummy, sizeof dummy, &key, 0);
   keyKeypad = XKeycodeToKeysym(..., bar->keycode, NUMLOCK_Mask);
   if (IsKeypadKey(keyKeypad))
      ...;
   // ...
}

如果你不关心Numlock状态"而什么都没有发生",只有当例如按键发生时,最低开销的方式是:

对于某些XKeyEvent *xke

bool numlock = ((xke->state & Mod2Mask) == Mod2Mask);

对于GDK,您可能需要类似GDK的东西。FilterFunc获取xevent。检查xevent->type .

#include <Xlib.h>
XEvent = (XEvent *) &xevent // from Gdk.FilterFunc
int type = event ->type;
switch(type) {
    case KeyPress:
    case KeyRelease:
        do_something_with((XKeyEvent *) event);
        break;
}

我做了一些嗅探,我发现了ioctl.h的一个可能的实现,它轮询键盘状态并针对几个标志进行测试。

看看这个表单帖子的实现,用K_NUMLOCK *代替K_CAPSLOCK。这是相当丑陋的,但它可以很容易地包装在一个函数和隐藏。

*替换的原因是由于一个旧的错误,其中大写锁定和num锁定意外颠倒。

我已经检查了硬件按键代码。每当num锁上并按下num键时,我比较硬件键代码,这是所有制造商普遍不变的。因此,我不需要使用ioctl.h header。

您可以使用以下linux命令来执行

{if (num_lock == 0) system("setleds -F +num");如果num_lock == 1);//什么都不做}