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

时间:2019-10-18 08:35:56

标签: c++ linux qt qml virtual-keyboard

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

到目前为止,我确实将char映射为要打印的不同键映射(不带班次,带班次,带Alt Gr等)。

因此,我必须在代码中的某个位置写下所有字符以用于不同的布局。

特别是对于布局和语言而言,如果两次或更多次按键会生成更复杂的字符,例如按`,然后按 a 来获得à变得非常讨厌。

所以我认为这是次优的方法,并且有一种更聪明的解决方案,可以仅提供扫描代码(如Linux中的“ showkey -s”所提供)并使用系统设置区域设置以获取正确的字符,例如QQuick LineEdit。

将扫描代码传递到系统以生成“真实”按键事件的最佳/正确方法是什么,以及如何在代码中“接收”它们?

系统是Linux。 C ++后端会很好。猜猜QML无法胜任... 为此生成一个自己的键盘输入设备会很聪明吗?

或者我可以将扫描代码注入到现有的键盘设备中以模拟压力吗?

1 个答案:

答案 0 :(得分:0)

以下源自

的代码
  

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