Java 如何使用AccessibilityService在Android上执行拖动(基于X,Y鼠标坐标)?
我想知道如何在基于X,Y鼠标坐标的android上执行拖动?考虑两个简单的例子,团队查看器/QuestSuto分别绘制远程智能手机上的“密码模式”和Windows油漆笔。 我所能做的就是(使用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
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);
}
}
}