生成组合的虚拟按键以获得 â、ó、ć 等更复杂的字符
Posted
技术标签:
【中文标题】生成组合的虚拟按键以获得 â、ó、ć 等更复杂的字符【英文标题】:Generate combined virtual key presses to get chars like â, ó, ć, and more complex 【发布时间】:2019-10-18 08:35:56 【问题描述】:我正在使用 QML 实现一个虚拟键盘。
到目前为止,我从字面上将 char 映射为打印不同的键映射(不带 shift、带 shift、带 Alt Gr 等)。
所以我必须在代码中的某处写下不同布局的所有字符。
特别是对于两个或多个按键会生成更复杂的字符的布局和语言,例如按 ` 然后按 a 来获得 à 变得非常讨厌。
所以我认为这是一种次优方法,并且有一个更聪明的解决方案来只提供扫描码(由 Linux 中的“showkey -s”提供)并使用系统语言环境设置以在 QQuick LineEdit 中打印正确的字符。
将扫描代码传递给系统以生成“真实”关键事件的最佳/正确方法是什么,以及如何在代码中“接收”它们。
系统是Linux。 C++ 后端会很好。猜猜 QML 单独无法胜任... 为此生成一个自己的键盘输入设备可能很聪明吗?
或者我可以将扫描码注入现有的键盘设备来模拟按键吗?
【问题讨论】:
扫码仅适用于硬件键盘和物理按键。由于à
不是物理密钥,它没有任何扫描码。 Qt 是从这个概念中去除了几层抽象。
@n.m.我知道这一点。硬件的模拟可以满足我的需要。我发现我的最后一个问题指向了正确的方向。
【参考方案1】:
以下代码派生自
How to Generate Keyboard Input Using libevdev in C
使用libevdev
似乎指向了正确的方向。
它允许将扫描码发送到新创建的键盘设备(需要root)。
#include <stdio.h>
#include <libevdev/libevdev.h>
#include <libevdev/libevdev-uinput.h>
#include <unistd.h>
int main()
int err;
struct libevdev *dev;
struct libevdev_uinput *uidev;
dev = libevdev_new();
libevdev_set_name(dev, "fake keyboard device");
libevdev_enable_event_type(dev, EV_KEY);
for(uint key = 1; key < 255; ++key)
libevdev_enable_event_code(dev, EV_KEY, key, nullptr);
err = libevdev_uinput_create_from_device(dev,
LIBEVDEV_UINPUT_OPEN_MANAGED,
&uidev);
if (err != 0)
return err;
sleep(1);
libevdev_uinput_write_event(uidev, EV_KEY, KEY_LEFTSHIFT, 1);
libevdev_uinput_write_event(uidev, EV_KEY, KEY_A, 1);
//libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
libevdev_uinput_write_event(uidev, EV_KEY, KEY_A, 0);
//libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
libevdev_uinput_write_event(uidev, EV_KEY, KEY_B, 1);
//libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
libevdev_uinput_write_event(uidev, EV_KEY, KEY_B, 0);
//libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
libevdev_uinput_write_event(uidev, EV_KEY, KEY_LEFTSHIFT, 0);
libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
sleep(1);
libevdev_uinput_destroy(uidev);
printf("\nComplete\n");
【讨论】:
以上是关于生成组合的虚拟按键以获得 â、ó、ć 等更复杂的字符的主要内容,如果未能解决你的问题,请参考以下文章
如何恢复西里尔短语“Âñòîðîíó Äîæäÿ”的正确字符编码?