生成组合虚拟按键以获取 â、ó、ć 等更复杂的字符

Generate combined virtual key presses to get chars like â, ó, ć, and more complex

我正在使用 QML 实现虚拟键盘。

到目前为止,我确实将字符映射到不同的键映射(w/o shift、shift、Alt Gr 等)。

所以我必须在代码中的某处写下不同布局的所有字符。

特别是对于布局和语言,其中两次或更多次按键会生成更复杂的字符,例如按 ` 后跟 a 以获得 à变得很讨厌。

所以我认为这是一个次优的方法,有一个更聪明的解决方案 只需提供扫描码(由 'showkey -s' 在 Linux) 并使用系统区域设置来获取打印在比方说 QQuick LineEdit 中的正确字符。

将扫描代码传递给系统以生成 "real" 关键事件的 best/correct 方法是什么?我如何在我的代码中 "receive" 它们。

系统为Linux。 C++ 后端会很好。猜猜 QML 本身不会有能力...... 可以为此生成一个自己的键盘输入设备吗?

或者我可以将扫描码注入现有的键盘设备来模拟按键吗?

以下代码源自

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");
}