OpenHarmony 输入事件注入方法
1 关键字 鼠标、键盘、触摸、事件注入2 问题描述 代码版本: OpenHarmony-v3.2-release问题描述: 如何不通过外设注入输入事件,操作鼠标,滑动系统界面等3 解决方案 3.1 uinput命令 用法:uinput <option> <command /> ... 选项包括: -M --鼠标 鼠
1 关键字
鼠标、键盘、触摸、事件注入
2 问题描述
代码版本: OpenHarmony-v3.2-release
问题描述: 如何不通过外设注入输入事件,操作鼠标,滑动系统界面等
3 解决方案
3.1 uinput命令
用法:uinput <option> <command> <arg>...
选项包括:
-M --鼠标
鼠标命令:
-m <dx> <dy> --移动到相对位置<dx> <dy>,
<dx1> <dy1> <dx2> <dy2> [滑动时间] --由<dx1> <dy1>到<dx2> <dy2>平滑移动
-d <key> --按下一个按键
0是左键
1是右键
2是中间键
-u <key> --松开按键
-c <key> --点击鼠标左键:按下鼠标左键然后松开
-b <dx1> <dy1> <id> [按压时间] [点击间隔时间] --双击
[按压时间] --时间范围大于1ms小于300ms
[点击间隔时间] --时间范围大于1ms,小于450ms
否则操作可能会产生错误或无效操作
-点击左键:按下鼠标左键然后松开
键值:0 - 左键
键值:1 - 右键
键值:2 - 中间键
键值:3 - 侧边按键
键值:4 - 额外按键
键值:5 - 向前键
键值:6 - 返回键
键值:7 - 任务键
-s <key> --方向键,正值向后滑动
-i <time> --time毫秒的程序间隔,负值向前滑动
-K --键盘
键盘命令:
-d <key> --按下(down)一个按键
-u <key> --松开(up)一个按键
-l <key> [长按时间] --按住这个键
-i <time> --程序间隔time毫秒
-T --触摸
触摸命令:
-d <dx1> <dy1> --按下(down)位置dx1 dy1,
-u <dx2> <dy2> --松开(up)位置dx1 dy1,
-m <dx1> <dy1> <dx2> <dy2> [滑动时间] --平滑移动,dx1 dy1到dx2 dy2,
-c <dx1> <dy1> [点击间隔] --点击触摸屏dx1 dy1,点击间隔:指按下和松开直接的间隔
-i <time> --time毫秒的程序间隔
-g <dx1> <dy1> <dx2> <dy2> [按压时间] [总时间] --拖动,按压时间不小于500ms,[总时间]-[按压时间]不小于500ms
否则操作结果可能会产生错误或无效操作
示例:
uinput -T -d 200 270 //按住这个位置(未松开)
uinput -T -u 200 270 //松开这个位置
这两次操作相当于在触摸屏(200,270)的位置点击一次
键盘键值可参考:键盘键值定义
输入大写字母A:uinput -K -d 2047 -d 2017 -u 2017
3.2 脚本
Windows脚本示例:
::hdc shell uinput -T -d 200 270
::hdc shell uinput -T -d 200 270
::向上滑动一段距离,滑动时间1秒钟
hdc shell uinput -T -m 200 470 200 270 1000
pause
hdc ---有些同学可能是hdc_std,根据自己的环境来;如果有多个设备同时再连接,可加-t参数,后面跟设备SN
3.3 native方式
以下是举例,举例内容为native方式实现这个操作:uinput -T -d 200 270,如有需要可根据自己的需求修改,具体可参考foundation/multimodalinput/input/tools/inject_event/src/input_manager_command.cpp文件的实现。
1. 添加foundation/multimodalinput/input/tools/inject_event/test/input_test.cpp文件
#include "define_multimodal.h"
#include "input_manager.h"
#include "mmi_log.h"
#include "pointer_event.h"
using namespace OHOS::MMI;
int32_t main(int32_t arg, char** argv)
{
auto pointerEvent = PointerEvent::Create();
if (pointerEvent == nullptr) {
return ERROR_NULL_POINTER;
}
PointerEvent::PointerItem item;
item.SetPointerId(0);
item.SetDisplayX(200);
item.SetDisplayY(270);
pointerEvent->SetPointerId(0);
pointerEvent->AddPointerItem(item);
pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN);
pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN);
InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
return 0;
}
2. 修改foundation/multimodalinput/input/tools/inject_event/BUILD.gn文件,添加input_test编译
ohos_executable("input_test") {
sources = [ "test/input_test.cpp" ]
deps = [
"$SUBSYSTEM_FRAMEWORKS_DIR/proxy:libmmi-client",
"//foundation/multimodalinput/input/util:libmmi-util",
]
subsystem_name = "multimodalinput"
part_name = "input"
}
3. 修改foundation/multimodalinput/input/BUILD.gn,添加input_test编译
group("multimodalinput_mmi_service") {
deps = [
"service:libmmi-server",
"tools/inject_event:uinput",
"tools/inject_event:input_test", #-----这一句为添加的
]
}
4. 全量编译或单编,生成input_test可执行文件
5. 将input_test可执行文件导入开发板/system/bin目录下,添加可执行权限
6. 执行input_test,实现在触摸屏上按下(200,270)位置
3.4 应用层js api
此方法只有按键事件注入接口,且仅对系统应用开放,可参考:
更多推荐
所有评论(0)