lvgl库使用libinput监听pc键盘

文章讲述了在lvgl框架下监听PC键盘事件遇到的问题及解决方案。作者发现官方示例代码在监听非功能键时未正确处理,通过分析libinput源码,了解到在不启用USE_XKB宏的情况下,部分按键未被正确赋值。作者通过修改代码解决了这个问题,使得在不依赖额外库的情况下能监听到所有按键事件。
摘要由CSDN通过智能技术生成

        lvgl的教程着实不多,官方的文档也不会针对所有情况提供示例代码,毕竟各人使用场景不同。lvgl中监听键盘的官方示例代码挺简单的,短短几行代码就可以实现键盘监听。但不知道是官方忽略了重要的部分还是业内人员都比较懂,所以对于监听PC键盘的处理大家都心领神会。但这可让我花了好几天时间来研究,终于才实现了监听PC键盘的所有按键事件,特此记录,分享给跟我一样的小白同学。

        对于lvgl的所有事件的监听其实都是添加事件回调函数,但键盘监听需要在初始化键盘的lv_indev_t对象后使用lv_indev_set_group添加到lv_group_t对象里面。组内的控件在添加对应回调事件后进行响应。此部分代码亦如官方示例代码一样:

  libinput_init();
  lv_group_t *g = lv_group_create();
  lv_group_set_default(g);
  static lv_indev_drv_t indev_keyboard;

  lv_indev_drv_init(&indev_keyboard);
  indev_keyboard.type = LV_INDEV_TYPE_KEYPAD;
  indev_keyboard.read_cb = libinput_read;

  lv_indev_t *keyboard_indev = lv_indev_drv_register(&indev_keyboard);
  lv_indev_set_group(keyboard_indev, g);

        也就是初始化键盘的接口和监听程序,其中libinput_read是官方基于Linux的libinput库开发的监听键盘的事件函数。初始化完成后需要使用lv_group_add_obj将要响应键盘事件的控件添加到与键盘统一个组g中,然后为该控件添加事件处理函数。

        理论上完成上述步骤后对应控件就可以对PC键盘的按键做出响应,但本人完成上述步骤后却没能如愿得到响应,并且奇怪的是按回车键确实有反应,但按其他的字母键或数字键却没有反应。

        于是分析官方提供的libinput.c的源码,打上断点跟踪调试,发现在函数read_keypad中,在不启用USE_XKB宏的情况下,获取到按键键值code后,只对部分功能键为传入的libinput_drv_state_t对象进行了赋值,在按数字键、字母键等其他按键的时候并未为其赋值,因此虽然监听到并读取了键盘的事件,但后续逻辑并未发出LV_EVENT_KEY的事件,因此控件不会有任何响应。如果开启USE_XKB的宏后,确实可以取到所有值,但又需要引用到一堆xkb相关的库,这并不是我想要的。

        因此决定将此处代码中的default分支加上键值的赋值来解决问题。经验证如此可在不启用USE_XKB宏的情况下正常获发出LV_EVENT_KEY事件,对应控件也有了响应。看了官方的github库上的问题,没有找到相关的提问。可能其他人都没有这种情况或者有这种情况有自己的解决办法。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果你想在 Java 8 中实现不使用 GUI 的方式监听鼠标或键盘事件,可以使用 Java 提供的一些底层,如 JNativeHook 或 JInput。 JNativeHook 是一个开源的 Java ,可以用于监听全局的键盘和鼠标事件。它可以在不需要图形界面的情况下运行,并提供了跨平台的支持。 首先,你需要下载 JNativeHook ,并将其添加到你的项目中。然后,你可以使用以下代码来监听键盘事件: ```java import org.jnativehook.GlobalScreen; import org.jnativehook.NativeHookException; import org.jnativehook.keyboard.NativeKeyEvent; import org.jnativehook.keyboard.NativeKeyListener; public class KeyboardListener { public static void main(String[] args) { try { // 初始化 NativeHook GlobalScreen.registerNativeHook(); // 添加键盘事件监听器 GlobalScreen.addNativeKeyListener(new NativeKeyListener() { @Override public void nativeKeyPressed(NativeKeyEvent e) { // 处理按键按下事件 System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode())); } @Override public void nativeKeyReleased(NativeKeyEvent e) { // 处理按键释放事件 System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode())); } @Override public void nativeKeyTyped(NativeKeyEvent e) { // 处理按键类型事件 } }); } catch (NativeHookException e) { e.printStackTrace(); } } } ``` 上述代码会监听全局的键盘事件,并在控制台输出按键的信息。 对于鼠标事件的监听,你可以使用 JNativeHook 的鼠标事件监听器 `NativeMouseListener` 和 `NativeMouseMotionListener`。 请注意,在使用 JNativeHook 时,你需要在程序结束时调用 `GlobalScreen.unregisterNativeHook()` 来释放资源。 另外,如果你想监听键盘或鼠标事件的特定应用程序窗口,而不是全局的事件,可以考虑使用其他或技术,如 JNA(Java Native Access)或操作系统提供的 API。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值