1

我正在使用 XI2 扩展来处理按键。然后在字段 event->xcookie->data 我得到一个 XIDeviceEvent deviceEvent。然后我在 deviceEvent->detail 中得到一个 32 位密钥代码。

如何将此 32 位密钥代码转换为字符串或字符?就像按下 Q 键一样,我想得到字符串“q”。

4

2 回答 2

2

好的,我想我想通了:

XIDeviceEvent *d_ev = (XIDeviceEvent*) ev.xcookie.data;
KeyCode keycode = d_ev->detail;
int keysyms_per_keycode;
KeySym *keysym = XGetKeyboardMapping (dpy, keycode, 1, &keysyms_per_keycode);
char * result = XKeysymToString (keysym[0]);

keysym[0] 中的 0 可能意味着没有修饰符。keysym[1] 带有移位(-> 大写字母),并且直到 keysyms_per_keycode-1 为止,还有所有其他可能的修饰符。

于 2013-05-04T10:42:07.877 回答
0

XGetKeyboardMapping 可以为您获取整个表,因此使用它来获取单个键码是多余的,但您至少应该 XFree 结果以避免内存泄漏。如果你想一次得到一个键,这看起来更干净

        KeySym ks = XkbKeycodeToKeysym(dpy, ev->detail, 0, 0);
        char * result = XKeysymToString(ks);

虽然我还不相信它真的考虑了 xkb 映射。

于 2013-05-18T21:41:28.710 回答