我正在使用QML实现虚拟键盘。
到目前为止,我确实将char映射为要打印的不同键映射(不带班次,带班次,带Alt Gr等)。
因此,我必须在代码中的某个位置写下所有字符以用于不同的布局。
特别是对于布局和语言而言,如果两次或更多次按键会生成更复杂的字符,例如按`,然后按 a 来获得à变得非常讨厌。
所以我认为这是次优的方法,并且有一种更聪明的解决方案,可以仅提供扫描代码(如Linux中的“ showkey -s”所提供)并使用系统设置区域设置以获取正确的字符,例如QQuick LineEdit。
将扫描代码传递到系统以生成“真实”按键事件的最佳/正确方法是什么,以及如何在代码中“接收”它们?
系统是Linux。 C ++后端会很好。猜猜QML无法胜任... 为此生成一个自己的键盘输入设备会很聪明吗?
或者我可以将扫描代码注入到现有的键盘设备中以模拟压力吗?
答案 0 :(得分:0)
以下源自
的代码使用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");
}