如何获得使用C / C ++的数字locking状态?

我已经阅读了Gdk论坛链接,其中说,获取数字locking状态API是从3.0版本开始实施的。 但是我正在使用2.4版本,因为我需要支持较低的Linux版本,所以我无法更新到3.0版本。 这里是讨论链接:

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

那么,有没有其他方法可以使用内部Linux命令获得num lock状态?

问候,iSight

Solutions Collecting From Web of "如何获得使用C / C ++的数字locking状态?"

获取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=%lx\n", x.led_mask); printf("NumLock is %s\n", (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");做一些事情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)) ...; // ... } 

你可以使用这个linux命令来做到这一点

{if(num_lock == 0)system(“setleds -F + num”); 否则如果num_lock == 1); //没做什么 }

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

看看这个表单的实现 ,并用K_NUMLOCK *替换K_CAPSLOCK 。 这非常的难看,但它可以很容易地包裹在一个功能,并藏起来。

*更换帖子的原因是由于一个旧的错误,大写锁定和数字锁意外颠倒。 现在应该修好了 。

我已经检查了硬件的关键代码。 每当num lock打开,并在数字键盘上按数字键,我比较所有制造商通用的硬件密钥代码。 因此,我不需要使用ioctl.h头。

如果你不关心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; }