生成组合虚拟按键以获取 â、ó、ć 等更复杂的字符
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");
}
我正在使用 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");
}