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

此方法只有按键事件注入接口,且仅对系统应用开放,可参考:

多模输入子系统.md

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐