Linux 获取将在“XKB\u KEY\u dead\u扬抑键”和普通键上键入的字符

Linux 获取将在“XKB\u KEY\u dead\u扬抑键”和普通键上键入的字符,linux,keyboard,x11,Linux,Keyboard,X11,是否有一种方法可以确定它将解析为哪个字符,例如我是否会键入XKB\u KEY\u dead\u扬抑符和chara?这里的结果将是,,但是我如何通过编程来检测这一点呢 这不仅适用于XKB\u-KEY\u-dead\u-spiflex,也适用于XKB\u-KEY\u-dead\u-greek,以键入希腊字母表。在X中,此特定行为由输入法(IM)决定。X非常灵活;您可以将XKB\u KEY\u dead\u扬抑和a组合成日语キ如果你喜欢。或者输出一个è,如果您想混淆您的用户 您可以尝试XmbLooku

是否有一种方法可以确定它将解析为哪个字符,例如我是否会键入
XKB\u KEY\u dead\u扬抑符
和char
a
?这里的结果将是
,但是我如何通过编程来检测这一点呢


这不仅适用于
XKB\u-KEY\u-dead\u-spiflex
,也适用于
XKB\u-KEY\u-dead\u-greek
,以键入希腊字母表。

在X中,此特定行为由输入法(IM)决定。X非常灵活;您可以将
XKB\u KEY\u dead\u扬抑
a
组合成日语
如果你喜欢。或者输出一个
è
,如果您想混淆您的用户

您可以尝试XmbLookupString或Xutf8LookupString来模拟按键并返回正确的字符:

XIM im= XOpenIM(display, NULL, NULL, NULL);
XIC ic = XCreateIC(im);

char buf[8];
KeySym symbol;
Status status;
XKeyPressedEvent event;
event.type = XKeyPressEvent;
event.display = display;
event.window = window;
event.state = 0; // optionally add Shift, Ctrl, Meta
event.keycode = XBK_KEY_dead_circumflex;
Xutf8LookupString(ic, &event, buf, 8, symbol, status); // send dead key
event.keycode = XBK_KEY_a;
Xutf8LookupString(ic, &event, buf, 8, symbol, status); // send real key
buf
现在应该包含
的UTF8代码
,但是检查
状态
以查看转换是否成功


请注意,您必须传递“a”的键码,而不是“a”的ASCII码(我不认为有任何X函数接受死键和字符并返回组合)。您还必须只模拟按键操作(请参阅Xutf8LookupString的手册页)。

不起作用:(。因此,我在第一次调用a“^”之后得到,在第二次调用a“a”之后得到的是XFilterEvent()在您的主事件循环中?这在本例中很重要…我不知道。我使用GTK处理GUI内容
Xutf8LookupString
是无状态的。创建一个不可见窗口并向其发送按键事件。