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