V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hkitdog
V2EX  ›  Android

如何实现安卓模拟器后台鼠标左击

  •  
  •   hkitdog · 2019-09-13 10:38:17 +08:00 via iPhone · 12555 次点击
    这是一个创建于 1900 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如何通过 Windows API 实现安卓模拟器后台鼠标操作?
    postmessage 可以实现后台按键,但是鼠标后台不行,我用 C#写的:
    PostMessage(Hwnd, WM_LBUTTONDOWN, 0, x + (y << 16));
    PostMessage(Hwnd , WM_LBUTTONUP, 0, x + (y << 16));
    运行时给了管理员权限,可以实现鼠标点击窗口控件句柄的指定位置,但是如果窗口最小化或者不在可视区域,鼠标点击就没有效果。
    安卓模拟器的运行模式有 opengl 和 directx 两种,C/C++或者 C#都可以。
    用了 autohotkey 的 controlclick 也不能实现后台鼠标
    我怀疑是系统不断获取鼠标的位置导致窗口接收到的鼠标坐标不对导致没有效果,是不是通过某种方法屏蔽掉这种消息到达窗口就能有效果?
    7 条回复    2019-09-14 21:59:18 +08:00
    yankebupt
        1
    yankebupt  
       2019-09-13 10:58:57 +08:00
    单开的话可以
    adb shell input tap X Y?
    多开暂时不知道。主要是懒得查怎么改默认 adb localhost 端口
    securityCoding
        2
    securityCoding  
       2019-09-13 11:00:22 +08:00
    adb 试试
    hfutzj
        3
    hfutzj  
       2019-09-13 11:14:42 +08:00 via Android
    后台的位置和前台的不一样,之前用别人的一个插件,绑定后台和不绑定,获取到的鼠标位置不同。具体你可以在前台试。因为如果绑定后台再模拟鼠标点击的话,鼠标是不会移动的。
    大漠插件
    gam2046
        4
    gam2046  
       2019-09-13 11:15:00 +08:00
    模拟器里,鼠标点击,到 Android 里面就是触屏事件,touch,因此直接按一楼方法即可。

    如果需要双击操作(即短时间内两次点击屏幕),无法用 adb 完成,因为每次 input 都是通过 app_process 启动一个进程,间隔时间太长。

    可以考虑通过事先录制的方式,事后回放。

    cat /dev/input/eventN > /sdcard/double_tap

    其中 N 是一个数字,不同设备代表的含义的不同。
    当需要回放操作的时候

    cat /sdcard/double_tap > /dev/input/eventN 即可
    EscYezi
        5
    EscYezi  
       2019-09-13 12:05:24 +08:00 via iPad
    可以用 airtest,模拟器开 usb 调试,然后在 airtest ide 里连接模拟器,用脚本操作。
    大概就像[airtest-arknights]( https://github.com/yeziyezi/airtest-arknights)这种
    不过这个并不是用的 Windows API🌚
    hkitdog
        6
    hkitdog  
    OP
       2019-09-14 10:31:56 +08:00 via iPhone
    @hfutzj 解决了,postmessage 是可以后台按键的,在百度找了个鼠标后台连点器分柝,发现问题出在句柄的选择上,发送消息对象不是选最内层的那个句柄而是倒数第三层的 Qt5QWindowIcon RenderWindowWindow,adb 估计可以,没试
    BoiledEgg
        7
    BoiledEgg  
       2019-09-14 21:59:18 +08:00
    autohotkey 如果不行的话有可能是因为没有用 admin 运行的原因,可以 script 开始的时候判断下 admin
    if !A_IsAdmin
    {
    Run *RunAs "%A_ScriptFullPath%"
    ExitApp
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1215 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 23:22 · PVG 07:22 · LAX 15:22 · JFK 18:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.