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

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

【讨论】:

以上是关于生成组合的虚拟按键以获得 â、ó、ć 等更复杂的字符的主要内容,如果未能解决你的问题,请参考以下文章

如何恢复西里尔短语“Âñòîðîíó Äîæäÿ”的正确字符编码?

使用非 ASCII 字符反转字符串

生成所有组合时的复杂性

如何以编程方式生成按键事件? [复制]

如果我从 randomforest、gbm、svm、nnet 生成预测以获得更准确的预测,如何组合结果(预测)?

Gcc,WinAPI和1250