我试图听键盘input(使用X11事件循环),并获得扫描码。 这些扫描码应该是指键的物理位置,而不是它所键入的字符。 问题是,我所能得到的是KeySyms和KeyCodes,它们对于不同的语言(例如QWERTY和QWERTZ)的映射方式不同。
我目前的解决scheme是读取“/ usr / share / X11 / xkb / keycodes / evdev”文件。 它包含关键位置到关键代码的映射。 使用这个我可以简单地将任何键码翻译回扫描码。 我的猜测是,这不是一个稳定的做法。 我根本不了解linux。 这就是为什么我认为在这里问这可能是一个好主意。
假设这些evdev映射被大多数用户的机器使用是安全的吗? 如果没有,我还能在哪里find实际使用的关键映射? 还是有更好的解决scheme呢?
如何从PreTranslateMessage(MSG * pMsg)中的WM_KEYDOWN中提取字符
什么是“暂停/rest”键的扫描码?
获取char的键盘扫描码
WinAPI – 扩展键盘扫描代码
从WM_CHAR消息获取扫描代码
F11和F12的windows扫描码是不同的。 为什么?
如何将X11 KeyCode或KeySym转换为扫描代码
我如何在linux中立即捕获关键笔划?
linux键盘扫描码问题:例如,向上键给出^ [[A
我有同样的问题,我刚刚找到一个解决方案。 让我们从明显的第一个开始。
如果你想得到特定的键,如“W”或“4”,不管他们在哪里,你可以把你从事件中收到的键码转换成KeySym。 在这种情况下,“W”是XK_W和XK_w ,“4”是XK_4 (在大多数键盘上是XK_4 )。
但是,有时候你想获得诸如“ 第 m行的第 n 个键”之类的键。 你需要键名来做到这一点。 在这种情况下,“W”是AD02 ,QWERTY键盘上的“4”是AE04 。
假设您正在制作一个玩家需要使用WASD键移动的游戏。 如果您寻找KeySyms,它将在QWERTY键盘上正常工作,但是使用其他键盘布局(如AZERTY,QWERTZ和DVORAK)的用户将遇到麻烦。 所以在这种情况下最好使用键名。
使用键名实际上是非常简单的,但文档非常混乱(但我仍然建议你看看它)。 我不得不看看GLFW的源代码(特别是src / x11_init.c ),因为我很无知。 这个方法需要Xkb,但你已经在使用它,所以我想这没有问题。
首先,您需要获取键盘映射并获取符号名称。 我们只需要键名,所以我们使用XkbKeynamesMask 。
#include <X11/XKBlib.h> XkbDescPtr KbDesc = XkbGetMap(Xdisplay,XkbUseCoreKbd); XkbGetnames(Xdisplay,XkbKeynamesMask,KbDesc);
然后,在事件循环中,您可以使用KbDesc-> names-> keys数组来获取特定键码的键名:
XEvent Event; XNextEvent(Xdisplay,&Event); switch (Event.type) { case KeyPress: /* I\’m not sure this \’if\’ is necessary,but better safe than sorry */ if ((Event.xkey.keycode >= KbDesc->min_key_code) && (Event.xkey.keycode <= KbDesc->max_key_code)) { /* copy key name into name */ char name[XkbKeynameLength + 1]; memcmp(name,KbDesc->names->keys[Event.xkey.keycode].name,XkbKeynameLength); name[XkbKeynameLength] = \’\’; /* Null terminator */ if (strcmp(name,\”AD02\”) == 0) /* Is it W (for QWERTY and QWERTZ) / Z (for AZERTY) / comma (for DVORAK) / ц (for Russian) etc… ? */ { /* Do something… */ } else if (strcmp(name,\”AE04\”) == 0) /* Is it 4 (for most keyboards) / whatever\’s in its place? */ { /* Do something… */ } /* … */ } /* … */ }
就是这样。 目前看起来工作得很好。 我想提一下,特殊键具有非常不同的键名。 例如,left Shift是LFSH ,left Control是LCTL ,Space是SPCE ,Escape是ESC 。
我希望它有帮助。
总结
以上是内存溢出为你收集整理的使用X11在Linux上获取扫描码而不是键码全部内容,希望文章能够帮你解决使用X11在Linux上获取扫描码而不是键码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容