1# 使用NativeWindowEventFilter过滤多模输入事件(C/C++)
2
3## 场景介绍
4
5开发者可以NativeWindowEventFilter模块提供的能力去拦截按键事件,让按键事件不往应用内部组件分发。
6
7
8## 接口说明
9
10| 接口名 | 描述 |
11| -------- | -------- |
12| OH_NativeWindowManager_RegisterKeyEventFilter (int32_t windowId, OH_NativeWindowManager_KeyEventFilter keyEventFilter); | 为指定的窗口注册过滤回调函数keyEventFilter。 |
13| OH_NativeWindowManager_UnregisterKeyEventFilter(int32_t windowId)| 取消指定窗口上的过滤回调函数。 |
14
15## 开发步骤
16### 在CMake脚本中链接动态库
17```
18target_link_libraries(entry PUBLIC libnative_window_manager.so libohinput.so)
19```
20
21### 添加头文件
22```
23#include "window_manager/oh_window_comm.h"
24#include "window_manager/oh_window_event_filter.h"
25#include "multimodalinput/oh_input_manager.h"
26#include "multimodalinput/oh_key_code.h"
27```
28
29### 接口使用说明
30- 应用窗口创建后,通过窗口ID去绑定窗口的按键事件过滤函数。
31- 应用窗口需要收到按键事件时,窗口才可触发按键事件的拦截。
32- 当回调函数返回值为true表示拦截,为false不拦截。
33- 同一个窗口ID注册的回调函数只允许一个,最后注册的回调函数会覆盖之前注册过的回调函数。如需过滤多个按键的组合场景,建议在一个回调函数里面处理。
34
35## 示例代码
36以下示例代码中介绍了如何注册过滤函数和取消过滤函数,以过滤ESC退出按键和数字按键为例。
37```
38#include "napi/native_api.h"
39#include "window_manager/oh_window_comm.h"
40#include "window_manager/oh_window_event_filter.h"
41#include "multimodalinput/oh_input_manager.h"
42#include "multimodalinput/oh_key_code.h"
43
44// 设置过滤函数
45static bool filterFunc(Input_KeyEvent *event) {
46  auto keyCode = OH_Input_GetKeyEventKeyCode(event);
47  auto action = OH_Input_GetKeyEventAction(event);
48  // case1: 过滤escape
49  // return keyCode == Input_KeyCode::KEYCODE_ESCAPE;
50
51  // case2: 过滤数字键的按下,抬起不过滤
52  // return keyCode >= Input_KeyCode::KEYCODE_0 && keyCode <= Input_KeyCode::KEYCODE_9
53  //  && action == Input_KeyEventAction::KEY_ACTION_DOWN;
54
55  // 过滤escape和数字键的按下(case1 || case2)
56  return (keyCode >= Input_KeyCode::KEYCODE_0 && keyCode <= Input_KeyCode::KEYCODE_9
57     && action == Input_KeyEventAction::KEY_ACTION_DOWN) || (keyCode == Input_KeyCode::KEYCODE_ESCAPE);
58}
59
60static napi_value registerFilter(napi_env env, napi_callback_info info) {
61  size_t argc = 1;
62  napi_value args[1] = {nullptr};
63  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
64
65  int32_t windowId;
66  napi_get_value_int32(env, args[0], &windowId);
67
68  // 向windowId对应的窗口注册filterFunc的过滤函数
69  auto res = OH_NativeWindowManager_RegisterKeyEventFilter(windowId, filterFunc);
70
71  napi_value errCode;
72  napi_create_int32(env, res, &errCode);
73  return errCode;
74}
75
76static napi_value clearFilter(napi_env env, napi_callback_info info) {
77  size_t argc = 1;
78  napi_value args[1] = {nullptr};
79  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
80
81  int32_t windowId;
82  napi_get_value_int32(env, args[0], &windowId);
83
84  auto res = OH_NativeWindowManager_UnregisterKeyEventFilter(windowId);
85  napi_value errCode;
86  napi_create_int32(env, res, &errCode);
87  return errCode;
88
89}
90
91EXTERN_C_START
92static napi_value Init(napi_env env, napi_value exports) {
93  napi_property_descriptor desc[] = {
94    {"registerFilter", nullptr, registerFilter, nullptr, nullptr, nullptr, napi_default, nullptr},
95    {"clearFilter", nullptr, clearFilter, nullptr, nullptr, nullptr, napi_default, nullptr}};
96  napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
97  return exports;
98}
99EXTERN_C_END
100
101```