我已经阅读了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的
答案 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头文件。