1# 事件监听开发指导(C/C++)
2
3## 功能介绍
4
5多模提供为应用提供了按键、输入事件(鼠标、触屏和轴事件)监听能力,当前仅支持录屏类应用。使用场景例如:用户在录屏应用开启录屏时,需要监听设备的按键、鼠标、触摸和轴事件。
6
7## 接口说明
8
9创建和删除事件监听相关接口如下表所示,接口详细介绍请参考[Input文档](../../reference/apis-input-kit/input.md)。
10
11| 接口名称  | 描述 |
12| ------------------------------------------------------------ | -------------------------- |
13| Input_Result OH_Input_AddKeyEventMonitor(Input_KeyEventCallback callback) |创建按键事件监听。  |
14| Input_Result OH_Input_AddMouseEventMonitor(Input_MouseEventCallback callback) |创建鼠标事件监听。  |
15| Input_Result OH_Input_AddTouchEventMonitor(Input_TouchEventCallback callback) |创建触摸事件监听。  |
16| Input_Result OH_Input_AddAxisEventMonitorForAll(Input_AxisEventCallback callback) |创建所有类型轴事件监听。  |
17| Input_Result OH_Input_AddAxisEventMonitor(InputEvent_AxisEventType axisEventType, Input_AxisEventCallback callback) |创建指定类型轴事件监听。  |
18| Input_Result OH_Input_RemoveKeyEventMonitor(Input_KeyEventCallback callback) |删除按键事件监听。  |
19| Input_Result OH_Input_RemoveMouseEventMonitor(Input_MouseEventCallback callback) |删除鼠标事件监听。  |
20| Input_Result OH_Input_RemoveTouchEventMonitor(Input_TouchEventCallback callback) |删除触摸事件监听。  |
21| Input_Result OH_Input_RemoveAxisEventMonitorForAll(Input_AxisEventCallback callback) |删除所有类型轴事件监听。  |
22| Input_Result OH_Input_RemoveAxisEventMonitor(InputEvent_AxisEventType axisEventType, Input_AxisEventCallback callback) |删除指定类型轴事件监听。  |
23
24## 开发步骤
25
26### 链接动态库
27
28调用创建和删除事件拦截前,需链接相关动态库。链接动态库的方法是,在CMakeList.txt文件中做下面例子所示的配置:
29
30```txt
31   target_link_libraries(entry PUBLIC libohinput.so)
32```
33
34### 申请所需权限
35
36应用需要在module.json5中添加下面权限的配置,详细的配置方法参考声明[声明权限文档](../../security/AccessToken/declare-permissions.md)。
37
38```json
39"requestPermissions": [
40    {
41        "name": "ohos.permission.INTERCEPT_INPUT_EVENT"
42    }
43]
44```
45
46### 创建事件监听
47
48#### 按键事件
49
50```c++
51#include "multimodalinput/oh_input_manager.h"
52
53struct KeyEvent {
54    int32_t action;
55    int32_t keyCode;
56    int64_t actionTime { -1 };
57};
58
59//定义按键事件回调函数
60void OnKeyEventCallback(const Input_KeyEvent* keyEvent)
61{
62    KeyEvent event;
63    //Input_KeyEvent的生命周期仅在回调函数内,出了回调函数会被销毁
64    event.action = OH_Input_GetKeyEventAction(keyEvent);
65    event.keyCode = OH_Input_GetKeyEventKeyCode(keyEvent);
66    event.actionTime = OH_Input_GetKeyEventActionTime(keyEvent);
67}
68
69void TestMonitor()
70{
71    //添加按键事件监听
72    Input_Result ret = OH_Input_AddKeyEventMonitor(OnKeyEventCallback);
73    //移除按键事件监听
74    ret = OH_Input_RemoveKeyEventMonitor(OnKeyEventCallback);
75}
76```
77
78#### 鼠标事件
79
80```c++
81#include "multimodalinput/oh_input_manager.h"
82
83struct MouseEvent {
84    int32_t action;
85    int32_t displayX;
86    int32_t displayY;
87    int32_t button { -1 };
88    int32_t axisType { -1 };
89    float axisValue { 0.0f };
90    int64_t actionTime { -1 };
91};
92
93//定义鼠标事件回调函数
94void OnMouseEventCallback(const Input_MouseEvent* mouseEvent)
95{
96    MouseEvent event;
97    //Input_MouseEvent的生命周期仅在回调函数内,出了回调函数会被销毁
98    event.action = OH_Input_GetMouseEventAction(mouseEvent);
99    event.displayX = OH_Input_GetMouseEventDisplayX(mouseEvent);
100    event.displayY = OH_Input_GetMouseEventDisplayY(mouseEvent);
101    event.button = OH_Input_GetMouseEventButton(mouseEvent);
102    event.axisType = OH_Input_GetMouseEventAxisType(mouseEvent);
103    event.axisValue = OH_Input_GetMouseEventAxisValue(mouseEvent);
104    event.actionTime = OH_Input_GetMouseEventActionTime(mouseEvent);
105}
106
107void TestMonitor()
108{
109    //添加鼠标事件监听
110    Input_Result ret = OH_Input_AddMouseEventMonitor(OnMouseEventCallback);
111    //移除鼠标事件监听
112    ret = OH_Input_RemoveMouseEventMonitor(OnMouseEventCallback);
113}
114```
115
116#### 触摸事件
117
118```c++
119#include "multimodalinput/oh_input_manager.h"
120
121struct TouchEvent {
122    int32_t action;
123    int32_t id;
124    int32_t displayX;
125    int32_t displayY;
126    int64_t actionTime { -1 };
127};
128
129//定义触摸事件回调函数
130void OnTouchEventCallback(const Input_TouchEvent* touchEvent)
131{
132    TouchEvent event;
133    //Input_TouchEvent的生命周期仅在回调函数内,出了回调函数会被销毁
134    event.action = OH_Input_GetTouchEventAction(touchEvent);
135    event.id = OH_Input_GetTouchEventFingerId(touchEvent);
136    event.displayX = OH_Input_GetTouchEventDisplayX(touchEvent);
137    event.displayY = OH_Input_GetTouchEventDisplayY(touchEvent);
138    event.actionTime = OH_Input_GetTouchEventActionTime(touchEvent);
139}
140
141void TestMonitor()
142{
143    //添加触摸事件监听
144    Input_Result ret = OH_Input_AddTouchEventMonitor(OnTouchEventCallback);
145    //移除触摸事件监听
146    ret = OH_Input_RemoveTouchEventMonitor(OnTouchEventCallback);
147}
148```
149
150#### 轴事件
151
152```c++
153#include "multimodalinput/oh_input_manager.h"
154#include <map>
155
156struct AxisEvent {
157    int32_t axisAction;
158    float displayX;
159    float displayY;
160    std::map<int32_t, double> axisValues;
161    int64_t actionTime { -1 };
162    int32_t sourceType;
163    int32_t axisEventType { -1 };
164};
165
166//定义所有类型轴事件回调函数
167void OnAllAxisEventCallback(const Input_AxisEvent* axisEvent)
168{
169    AxisEvent event;
170
171    //Input_AxisEvent的生命周期仅在回调函数内,出了回调函数会被销毁
172    InputEvent_AxisAction action;
173    Input_Result ret = OH_Input_GetAxisEventAction(axisEvent, &action);
174    event.axisAction = action;
175    ret = OH_Input_GetAxisEventDisplayX(axisEvent, &event.displayX);
176    ret = OH_Input_GetAxisEventDisplayY(axisEvent, &event.displayY);
177    ret = OH_Input_GetAxisEventActionTime(axisEvent, &event.actionTime);
178    InputEvent_SourceType sourceType;
179    ret = OH_Input_GetAxisEventSourceType(axisEvent, &sourceType);
180    event.sourceType = sourceType;
181    InputEvent_AxisEventType axisEventType;
182    ret = OH_Input_GetAxisEventType(axisEvent, &axisEventType);
183    event.axisEventType = axisEventType;
184    if (event.axisEventType == AXIS_EVENT_TYPE_PINCH) {
185        double value = 0;
186        ret = OH_Input_GetAxisEventAxisValue(axisEvent, AXIS_TYPE_PINCH, &value);
187        event.axisValues.insert(std::make_pair(AXIS_TYPE_PINCH, value));
188        ret = OH_Input_GetAxisEventAxisValue(axisEvent, AXIS_TYPE_ROTATE, &value);
189        event.axisValues.insert(std::make_pair(AXIS_TYPE_ROTATE, value));
190    } else if (event.axisEventType == AXIS_EVENT_TYPE_SCROLL) {
191        double value = 0;
192        ret = OH_Input_GetAxisEventAxisValue(axisEvent, AXIS_TYPE_SCROLL_VERTICAL, &value);
193        event.axisValues.insert(std::make_pair(AXIS_TYPE_SCROLL_VERTICAL, value));
194        ret = OH_Input_GetAxisEventAxisValue(axisEvent, AXIS_TYPE_SCROLL_HORIZONTAL, &value);
195        event.axisValues.insert(std::make_pair(AXIS_TYPE_SCROLL_HORIZONTAL, value));
196    }
197}
198
199//定义捏合类型轴事件回调函数
200void OnPinchAxisEventCallback(const Input_AxisEvent* axisEvent)
201{
202    AxisEvent event;
203
204    //Input_AxisEvent的生命周期仅在回调函数内,出了回调函数会被销毁
205    InputEvent_AxisAction action;
206    Input_Result ret = OH_Input_GetAxisEventAction(axisEvent, &action);
207    event.axisAction = action;
208    ret = OH_Input_GetAxisEventDisplayX(axisEvent, &event.displayX);
209    ret = OH_Input_GetAxisEventDisplayY(axisEvent, &event.displayY);
210    ret = OH_Input_GetAxisEventActionTime(axisEvent, &event.actionTime);
211    InputEvent_SourceType sourceType;
212    ret = OH_Input_GetAxisEventSourceType(axisEvent, &sourceType);
213    event.sourceType = sourceType;
214    InputEvent_AxisEventType axisEventType;
215    ret = OH_Input_GetAxisEventType(axisEvent, &axisEventType);
216    event.axisEventType = axisEventType;
217    double value = 0;
218    ret = OH_Input_GetAxisEventAxisValue(axisEvent, AXIS_TYPE_PINCH, &value);
219    event.axisValues.insert(std::make_pair(AXIS_TYPE_PINCH, value));
220    ret = OH_Input_GetAxisEventAxisValue(axisEvent, AXIS_TYPE_ROTATE, &value);
221    event.axisValues.insert(std::make_pair(AXIS_TYPE_ROTATE, value));
222}
223
224//定义滚轮类型轴事件回调函数
225void OnScrollAxisEventCallback(const Input_AxisEvent* axisEvent)
226{
227    AxisEvent event;
228
229    //Input_AxisEvent的生命周期仅在回调函数内,出了回调函数会被销毁
230    InputEvent_AxisAction action;
231    Input_Result ret = OH_Input_GetAxisEventAction(axisEvent, &action);
232    event.axisAction = action;
233    ret = OH_Input_GetAxisEventDisplayX(axisEvent, &event.displayX);
234    ret = OH_Input_GetAxisEventDisplayY(axisEvent, &event.displayY);
235    ret = OH_Input_GetAxisEventActionTime(axisEvent, &event.actionTime);
236    InputEvent_SourceType sourceType;
237    ret = OH_Input_GetAxisEventSourceType(axisEvent, &sourceType);
238    event.sourceType = sourceType;
239    InputEvent_AxisEventType axisEventType;
240    ret = OH_Input_GetAxisEventType(axisEvent, &axisEventType);
241    event.axisEventType = axisEventType;
242    double value = 0;
243    ret = OH_Input_GetAxisEventAxisValue(axisEvent, AXIS_TYPE_SCROLL_VERTICAL, &value);
244    event.axisValues.insert(std::make_pair(AXIS_TYPE_SCROLL_VERTICAL, value));
245    ret = OH_Input_GetAxisEventAxisValue(axisEvent, AXIS_TYPE_SCROLL_HORIZONTAL, &value);
246    event.axisValues.insert(std::make_pair(AXIS_TYPE_SCROLL_HORIZONTAL, value));
247}
248
249void TestMonitor()
250{
251    //添加所有类型轴事件监听
252    Input_Result ret = OH_Input_AddAxisEventMonitorForAll(OnAllAxisEventCallback);
253    //移除所有类型轴事件监听
254    ret = OH_Input_RemoveAxisEventMonitorForAll(OnAllAxisEventCallback);
255
256    //添加捏合类型轴事件监听
257    ret = OH_Input_AddAxisEventMonitor(AXIS_EVENT_TYPE_PINCH, OnPinchAxisEventCallback);
258    //移除捏合类型轴事件监听
259    ret = OH_Input_RemoveAxisEventMonitor(AXIS_EVENT_TYPE_PINCH, OnPinchAxisEventCallback);
260
261    //添加滚轮类型轴事件监听
262    ret = OH_Input_AddAxisEventMonitor(AXIS_EVENT_TYPE_SCROLL, OnScrollAxisEventCallback);
263    //移除滚轮类型轴事件监听
264    ret = OH_Input_RemoveAxisEventMonitor(AXIS_EVENT_TYPE_SCROLL, OnScrollAxisEventCallback);
265}
266```
267