如何使用C / C ++获得num lock状态?

时间:2011-12-08 07:52:47

标签: c++ c linux gtk x11

我已经阅读了Gdk论坛链接,其中说明从版本3.0开始实现获取num lock state api。但我使用的是2.4版本,因为我需要支持更低版本的Linux版本,因此我无法更新到3.0版本。这是讨论链接:

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

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

此致 iSight的

5 个答案:

答案 0 :(得分:5)

获取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");执行某些操作。

面具的第二位对于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))
      ...;
   // ...
}

答案 1 :(得分:1)

如果你不关心Numlock状态&#34;什么也没发生&#34;,只有在例如一个按键发生,最低的开销方式就是这个。

对于某些 <ListView x:Name="theListView" ...> ... <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> ... <Setter Property="MinWidth" Value="0"/> ... </Style> </ListView.ItemContainerStyle> </ListView>

XKeyEvent *xke

对于GDK,您可能需要Gdk.FilterFunc之类的内容来获取bool numlock = ((xke->state & Mod2Mask) == Mod2Mask); 。检查xevent

xevent->type

答案 2 :(得分:0)

您可以使用此linux命令执行此操作

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

答案 3 :(得分:0)

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

Take a look at this form post's implementation,并将K_CAPSLOCK替换为K_NUMLOCK *。它非常难看,但它可以轻松地包裹在一个功能中并隐藏起来。

*在帖子上替换的原因是因为一个旧的错误,其中大写锁定和数字锁定被意外逆转。 It should be fixed now

答案 4 :(得分:0)

我检查了硬件密钥代码。每当打开num lock并按下数字键盘上的数字键,我就会将硬件密钥代码与普通制造商进行比较。因此,我不需要使用ioctl.h头文件。