如何将设备屏幕位置转换为sendevent位置?

3

我知道input tap x y这个Shell命令,但是我想了解如何使用sendevent命令执行点击。我已经能够通过以下命令实现:

sendevent /dev/input/event5 3 53 X &&
sendevent /dev/input/event5 3 54 Y &&
sendevent /dev/input/event5 0 2 0 &&
sendevent /dev/input/event5 0 0 0 &&
sendevent /dev/input/event5 0 2 0 &&
sendevent /dev/input/event5 0 0 0

在这里,XY代表被点击的位置。我正在安卓模拟器BlueStacks 5上测试它,显示分辨率设置为1920x1080

代码能够工作且点击被触发,但是我不知道如何将我想要点击的位置转换为sendevent XY位置。

如果我使用ADB发送:

sendevent /dev/input/event5 3 53 2000 &&
sendevent /dev/input/event5 3 54 2000 &&
sendevent /dev/input/event5 0 2 0 &&
sendevent /dev/input/event5 0 0 0 &&
sendevent /dev/input/event5 0 2 0 &&
sendevent /dev/input/event5 0 0 0

点击发生在x75 y75附近,如何计算?我的意思是屏幕坐标xy -> 发送事件xy?


如何复制:

  • 首先在窗口中启用BlueStacks 5 adb:设置 -> 高级 -> Android调试桥
  • 打开cmd窗口并运行cd C:\Program Files\BlueStacks_nxt,假设BlueStacks安装在默认路径。

执行以下命令:

  • hd-adb.exe connect 127.0.0.1:X其中X是在启用ADB的窗口中显示的端口号。
  • hd-adb.exe -s 127.0.0.1:X shell

现在我们进入了shell,执行一个新命令:getevent -p 并搜索:

... /dev/input/event5
  name:     "BlueStacks Virtual Touch"

在我的模拟器上,触摸输入事件是 event5 ,在你的设备上可能不同,请相应更改。

现在您可以使用下面的代码模拟点击,将 XY 更改为要单击的位置:

    sendevent /dev/input/event5 3 53 X &&
    sendevent /dev/input/event5 3 54 Y &&
    sendevent /dev/input/event5 0 2 0 &&
    sendevent /dev/input/event5 0 0 0 &&
    sendevent /dev/input/event5 0 2 0 &&
    sendevent /dev/input/event5 0 0 0

我正在尝试弄清如何将模拟器屏幕位置转换为sendevent位置。

例如,如果您想要在x200 y200处执行单击操作,需要使用sendevent,那么需要的值是多少?

如何计算?


我相信那些x和y是绝对屏幕坐标(因此不仅仅是窗口坐标,您必须包括工具栏、状态栏和其他装饰)。 - Gabe Sechan
@GabeSechan 当我在shell上运行view.getLocationOnScreen()时,什么也没有发生。 - Nathan
1
这不是一个 shell 命令,而是应用程序中的一个函数。无法通过 shell 完成此操作,因为 View 的概念并不超出它所在的应用程序。 - Gabe Sechan
1
@TDG 不,要在模拟器上点击x1900~,我需要使用ADB发送一个值大于“30000”的“sendevent”,很奇怪。 - Nathan
确实很奇怪,你试过用真实设备测试吗? - TDG
显示剩余4条评论
1个回答

3
感谢提供非常精确的操作说明以复现:
我启用了以下设置:
设置 -> 高级设置 -> 输入调试 -> 显示触摸点视觉反馈

设置 -> 高级设置 -> 输入调试 -> 显示当前触摸数据的指针位置
当我按住点击时,我可以看到: X: Y: 我记录了这些 X 坐标点,我的最大 X:1600.0,因此我的宽度是 1600.0
(8000, 390.6)
(16000, 781.2)
(32000, 1562.5)

然后在Excel中:选择 X Y (scatter) 图表,添加趋势线,单击趋势线并单击大加号 -> 图表元素 -> 趋势线:(选中它)和 ▶, 更多选项... -> 趋势线选项 -> 在图表上显示方程式
,单击公式,然后标签选项 -> 类别:数字,小数位数:10
y = 0.0488294643x - 0.0500000000

1600 = 0.0488294643x - 0.0500000000
32767 = X

我将其四舍五入为 32768 ,因为32768 是接近Int16的32767 的一个特殊数字
编辑:根据Nathan的评论,在这里应该是32767(32768甚至没有移动光标)

所以公式是:(W:宽度,H:高度)

32767*X/W
32767*Y/H

为您准备的 (X=200, Y=200, W=1980, H=1080)

32767*200/1920
32767*200/1080

3413.22916666667
6067.96296296296

我使用了这段代码进行测试:它不会轻敲,只是一直按住而没有释放

sendevent /dev/input/event5 3 57 0
sendevent /dev/input/event5 3 53 3413.22916666667
sendevent /dev/input/event5 3 54 6067.96296296296
sendevent /dev/input/event5 3 48 5
sendevent /dev/input/event5 3 58 50
sendevent /dev/input/event5 0 2 0
sendevent /dev/input/event5 0 0 0

https://ktnr74.blogspot.com/2013/06/emulating-touchscreen-interaction-with.html#:~:text=ABS_MT_TRACKING_ID%20(57)%20%2D%20ID,end%20of%20report


1
谢谢!我不明白你是如何得到这些值的 0.0488294643x - 0.0500000000 - Nathan
我不小心省略了一步操作,但是:Excel:+ -> 图表元素 -> 趋势线:(勾选)和▶,更多选项... -> 趋势线选项 -> 在图表上显示方程式。基本上,它计算最佳拟合直线并给出斜率,由于这些点几乎完美对齐,我也可以使用 ((781.2 - 390.6) / (16000 - 8000)) 来获取斜率,但我不知道。 - Mr. Doge
所以我只是在寻找这些点之间是否存在数学关系,是 y = mx 吗?或者像 Gabe 说的:“你必须包括工具栏、状态栏和其他装饰”:y = mx + b?用公式比手动编写代码来计算窗口大小更容易吗?我正在考虑:https://www.autohotkey.com/docs/commands/WinGetPos.htm。 - Mr. Doge
1
工具栏的高度固定为32像素,无法使用sendevent单击它,因为它位于不同的窗口中,而此窗口与Android/adb无关。我正在测试它,看起来公式确实是32767 * x / w 32767 * y / h 32768,在sendevent上甚至无法触发点击。谢谢,Doge! - Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接