Java 如何使用AccessibilityService在Android上执行拖动(基于X,Y鼠标坐标)?

Java 如何使用AccessibilityService在Android上执行拖动(基于X,Y鼠标坐标)?,java,c#,android,accessibilityservice,mouse-coordinates,Java,C#,Android,Accessibilityservice,Mouse Coordinates,我想知道如何在基于X,Y鼠标坐标的android上执行拖动?考虑两个简单的例子,团队查看器/QuestSuto分别绘制远程智能手机上的“密码模式”和Windows油漆笔。 我所能做的就是(使用dispatch手势()和AccessibilityNodeInfo.ACTION\u单击) 我找到了这些相关链接,但不知道它们是否有用: 下面是我的工作代码,用于将鼠标坐标(在PictureBox控件内)发送到远程手机并模拟触摸 Windows窗体应用程序: private void pic

我想知道如何在基于X,Y鼠标坐标的android上执行拖动?考虑两个简单的例子,团队查看器/QuestSuto分别绘制远程智能手机上的“密码模式”和Windows油漆笔。

我所能做的就是(使用
dispatch手势()
AccessibilityNodeInfo.ACTION\u单击

我找到了这些相关链接,但不知道它们是否有用:

下面是我的工作代码,用于将鼠标坐标(在
PictureBox
控件内)发送到远程手机并模拟触摸

Windows窗体应用程序:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    foreach (ListViewItem item in lvConnections.SelectedItems)
    {
        // Remote screen resolution
        string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920

        int xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width);
        int yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);

        Client client = (Client)item.Tag;

        if (e.Button == MouseButtons.Left)
            client.sock.Send(Encoding.UTF8.GetBytes("TOUCH" + xClick + "<|>" + yClick + Environment.NewLine));
    }
}
这将产生以下结果(但仍然无法绘制“模式密码”,例如TeamViewer)。但正如在下面的评论中所说,我认为通过类似的方法,这可以通过使用“可能”来实现。欢迎在这方面提出任何建议


编辑2:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    foreach (ListViewItem item in lvConnections.SelectedItems)
    {
        // Remote screen resolution
        string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920

        int xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width);
        int yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);

        Client client = (Client)item.Tag;

        if (e.Button == MouseButtons.Left)
            client.sock.Send(Encoding.UTF8.GetBytes("TOUCH" + xClick + "<|>" + yClick + Environment.NewLine));
    }
}
当然,解决方案就像上一篇编辑中所说的那样

下面是我找到的假定固定代码=>

android可访问性服务:

然后,我的疑问是:如何正确发送上面代码的鼠标坐标,以何种方式可以执行向任何方向的拖动?一些想法


编辑3:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    foreach (ListViewItem item in lvConnections.SelectedItems)
    {
        // Remote screen resolution
        string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920

        int xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width);
        int yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);

        Client client = (Client)item.Tag;

        if (e.Button == MouseButtons.Left)
            client.sock.Send(Encoding.UTF8.GetBytes("TOUCH" + xClick + "<|>" + yClick + Environment.NewLine));
    }
}
我发现了两个用于执行拖动的例程,但它们使用+。好吧,事件注入只在said和我不想要的系统应用程序中起作用

这是可以找到的例程:

然后为了实现我的目标,我认为2rd例程更适合使用(遵循逻辑,不包括事件注入),代码显示在Edit 2上,并分别发送
pictureBox1\u MouseDown
pictureBox1\u MouseMove
(C#Windows窗体应用程序)的所有点来填充
点[]
动态并在
pictureBox1\u鼠标上
发送cmd以执行例程并使用此数组填充。如果你对第一套有什么想法,请告诉我:D

如果在阅读此编辑后您有了一个可能的解决方案,请给我一个答案,我将尝试测试这个想法。

您尝试过使用脚本吗

可以在特定窗口/屏幕中保存坐标。 在绘制图案时,可以按住鼠标单击

如果您需要,我还为您提供了一些示例代码/脚本


编辑:

根据您的要求,您可以在C#上使用Auto IT

遵循以下步骤:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    foreach (ListViewItem item in lvConnections.SelectedItems)
    {
        // Remote screen resolution
        string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920

        int xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width);
        int yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);

        Client client = (Client)item.Tag;

        if (e.Button == MouseButtons.Left)
            client.sock.Send(Encoding.UTF8.GetBytes("TOUCH" + xClick + "<|>" + yClick + Environment.NewLine));
    }
}
  • 安装自动IT
  • 在引用管理器(AutoItX3.dll)中将其自动添加为引用
  • 然后导入添加的库:
    使用AutoItX3Lib
  • 创建名为“auto”的新AutoItX3对象:
    AutoItX3 auto=new AutoItX3()
  • 您现在可以执行自动It命令
  • 这是执行鼠标单击的完整示例:

    Using AutoItX3Lib;
    AutoItX3 auto = new AutoItX3();
    auto.MouseClick("left", 78, 1133, 1, 35)
    

    使用
    AutoIt窗口信息工具
    可以检查要使用的坐标

    请注意,鼠标坐标模式之间存在差异:

    例如:
    auto.AutoItSetOption(“MouseCoordMode”,1)
    将使用绝对屏幕坐标。见资料来源



    要按住鼠标单击,您可以选中

    ,这是一个基于问题的编辑3的解决方案示例


    C#Windows Froms应用程序“formMain.cs”:


    TeamViewer很可能未使用辅助功能框架。他们与设备制造商有特殊协议,这就是为什么他们的产品不能适用于所有设备。@commonware谢谢。但我认为这是一个可能的解决办法。关于您的第一次面试,请参见第节
    pictureBox1\u MouseDown
    不得发送坐标。它应该只存储初始坐标,然后在
    pictureBox1\u MouseUp
    上发送它们,因为这标志着鼠标移动的结束。这没有帮助。你的建议正是我的C#Windows窗体应用程序所提出的。
    using System.Net.Sockets;
    
    private List<Point> lstPoints;
    
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    {
        if (e.Button == MouseButtons.Left)
        {
            lstPoints = new List<Point>();
            lstPoints.Add(new Point(e.X, e.Y));
        }
    }
    
    private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            lstPoints.Add(new Point(e.X, e.Y));
        }
    }
    
    private void PictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        lstPoints.Add(new Point(e.X, e.Y));
    
        StringBuilder sb = new StringBuilder();
    
        foreach (Point obj in lstPoints)
        {
            sb.Append(Convert.ToString(obj) + ":");
        }
    
        serverSocket.Send("MDRAWEVENT" + sb.ToString() + Environment.NewLine);
    }
    
    import java.net.Socket;
    
    String xline;
    
    while (clientSocket.isConnected()) {
    
        BufferedReader xreader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), StandardCharsets.UTF_8));
    
        if (xreader.ready()) {
    
            while ((xline = xreader.readLine()) != null) {
                    xline = xline.trim();
    
                if (xline != null && !xline.trim().isEmpty()) {
    
                    if (xline.contains("MDRAWEVENT")) {
    
                        String coordinates = xline.replace("MDRAWEVENT", "");
                        String[] tokens = coordinates.split(Pattern.quote(":"));
                        Point[] moviments = new Point[tokens.length];
    
                        for (int i = 0; i < tokens.length; i++) {
                           String[] coordinates = tokens[i].replace("{", "").replace("}", "").split(",");
    
                           int x = Integer.parseInt(coordinates[0].split("=")[1]);
                           int y = Integer.parseInt(coordinates[1].split("=")[1]);
    
                           moviments[i] = new Point(x, y);
                        }
    
                        MyAccessibilityService.instance.mouseDraw(moviments, 2000);
                    }
                }
            }
        }
    }
    
    public void mouseDraw(Point[] segments, int time) {
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    
            Path path = new Path();
            path.moveTo(segments[0].x, segments[0].y);
    
            for (int i = 1; i < segments.length; i++) {
    
                path.lineTo(segments[i].x, segments[i].y);
    
                GestureDescription.StrokeDescription sd = new GestureDescription.StrokeDescription(path, 0, time);
    
                dispatchGesture(new GestureDescription.Builder().addStroke(sd).build(), new AccessibilityService.GestureResultCallback() {
    
                    @Override
                    public void onCompleted(GestureDescription gestureDescription) {
                        super.onCompleted(gestureDescription);
                    }
    
                    @Override
                    public void onCancelled(GestureDescription gestureDescription) {
                        super.onCancelled(gestureDescription);
                    }
                }, null);
            }
        }
    }