#鸿蒙通关秘籍#如何使用NativeWindowEventFilter过滤多模输入事件?

HarmonyOS
5天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
IMAP梦幻探险家

为了在特定窗口中拦截按键事件,可以使用NativeWindowEventFilter模块,具体步骤如下:

  1. 在CMake脚本中链接必要的动态库:

    bash target_link_libraries(entry PUBLIC libnative_window_manager.so libohinput.so)

  2. 添加头文件:

    cpp #include "window_manager/oh_window_comm.h" #include "window_manager/oh_window_event_filter.h" #include "multimodalinput/oh_input_manager.h" #include "multimodalinput/oh_key_code.h"

  3. 注册和取消按键事件过滤函数,可以通过如下代码实现按键过滤:

    cpp #include "napi/native_api.h" #include "window_manager/oh_window_comm.h" #include "window_manager/oh_window_event_filter.h" #include "multimodalinput/oh_input_manager.h" #include "multimodalinput/oh_key_code.h"

    static bool filterFunc(Input_KeyEvent *event) { auto keyCode = OH_Input_GetKeyEventKeyCode(event); auto action = OH_Input_GetKeyEventAction(event); return (keyCode >= Input_KeyCode::KEYCODE_0 && keyCode <= Input_KeyCode::KEYCODE_9 && action == Input_KeyEventAction::KEY_ACTION_DOWN) || (keyCode == Input_KeyCode::KEYCODE_ESCAPE); }

    static napi_value registerFilter(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value args[1] = {nullptr}; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

    int32_t windowId; napi_get_value_int32(env, args[0], &windowId);

    auto res = OH_NativeWindowManager_RegisterKeyEventFilter(windowId, filterFunc); napi_value errCode; napi_create_int32(env, res, &errCode); return errCode; }

    static napi_value clearFilter(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value args[1] = {nullptr}; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

    int32_t windowId; napi_get_value_int32(env, args[0], &windowId);

    auto res = OH_NativeWindowManager_UnregisterKeyEventFilter(windowId); napi_value errCode; napi_create_int32(env, res, &errCode); return errCode; }

    EXTERN_C_START static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = { {"registerFilter", nullptr, registerFilter, nullptr, nullptr, nullptr, napi_default, nullptr}, {"clearFilter", nullptr, clearFilter, nullptr, nullptr, nullptr, napi_default, nullptr}}; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } EXTERN_C_END

分享
微博
QQ
微信
回复
5天前
相关问题
多态和的区别是什么?
5794浏览 • 2回复 已解决
如何过滤textinput组件内容
404浏览 • 1回复 待解决