অ্যাক্সেসিবিলিটি সার্ভিসটি ব্যবহার করে অ্যান্ড্রয়েডে কীভাবে একটি ড্রাগ (এক্স, ওয়াই মাউস স্থানাঙ্কের ভিত্তিতে) সঞ্চালন করা যায়?


39

আমি কীভাবে এক্স, ওয়াই মাউস স্থানাঙ্কের ভিত্তিতে অ্যান্ড্রয়েডের উপর একটি টানা প্রদর্শন করতে পারি তা জানতে চাই? দুটি সহজ উদাহরণ হিসাবে বিবেচনা করুন, টিম ভিউয়ার / কুইকসপোর্ট যথাক্রমে দূরবর্তী স্মার্টফোনে এবং "উইন্ডোজ পেইন্ট অফ উইন্ডোজ পেইন্ট" এ "পাসওয়ার্ডের প্যাটার্ন" আঁকেন।

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

আমি যা করতে সক্ষম তা হ'ল সিমুলেট টাচ (সাথে dispatchGesture()এবং এছাড়াও AccessibilityNodeInfo.ACTION_CLICK)।

আমি এই প্রাসঙ্গিক লিঙ্কগুলি পেয়েছি, তবে সেগুলি কার্যকর হতে পারে কিনা তা আমি জানি না:

নীচে আমার ওয়ার্কিং কোডটি যা PictureBoxদূরবর্তী ফোনে মাউস স্থানাঙ্কগুলি ( নিয়ন্ত্রণের অভ্যন্তরে) প্রেরণ এবং স্পর্শের অনুকরণে ব্যবহার করতে ব্যবহৃত হয় ।

উইন্ডোজ ফর্ম অ্যাপ্লিকেশন:

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));
    }
}

সম্পাদনা:

আমার শেষ প্রয়াসটি ছিল যথাক্রমে মাউস স্থানাঙ্ক (সি # উইন্ডোজ ফর্ম অ্যাপ্লিকেশন) এবং একটি কাস্টম অ্যান্ড্রয়েড রুটিন (উপরের সাথে সংযুক্ত "সোয়াইপ স্ক্রিন" কোডের প্রসঙ্গে) ব্যবহার করে:

private Point mdownPoint = new Point();

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

        Client client = (Client)item.Tag;

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

            // Saving start position:

            mdownPoint.X = xClick; 
            mdownPoint.Y = yClick; 

            client.sock.Send(Encoding.UTF8.GetBytes("TOUCH" + xClick + "<|>" + yClick + Environment.NewLine));
        }
    }
}

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

        Client client = (Client)item.Tag;

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

            client.sock.Send(Encoding.UTF8.GetBytes("MOUSESWIPESCREEN" + mdownPoint.X + "<|>" + mdownPoint.Y + "<|>" + xClick + "<|>" + yClick + Environment.NewLine));
        }
    }
}

অ্যান্ড্রয়েড অ্যাক্সেসিবিলিটি সার্ভিস :

public void Swipe(int x1, int y1, int x2, int y2, int time) {

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    System.out.println(" ======= Swipe =======");

    GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();
    Path path = new Path();
    path.moveTo(x1, y1);
    path.lineTo(x2, y2);

    gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path, 100, time));
    dispatchGesture(gestureBuilder.build(), new GestureResultCallback() {
        @Override
        public void onCompleted(GestureDescription gestureDescription) {
            System.out.println("SWIPE Gesture Completed :D");
            super.onCompleted(gestureDescription);
        }
    }, null);
}

}

যা নিম্নলিখিত ফলাফল তৈরি করে (তবে এখনও উদাহরণস্বরূপ টিমভিউয়ারের মতো "প্যাটার্ন পাসওয়ার্ড" আঁকতে সক্ষম নয়)। তবে নীচের মন্তব্যে লাইকটি বলেছি, আমি মনে করি যে একই ধরণের পদ্ধতির সাহায্যে এটি সম্ভবত চালিয়ে যাওয়া অঙ্গভঙ্গি ব্যবহার করে অর্জন করা যেতে পারে । এই দিকনির্দেশে যে কোনও পরামর্শই স্বাগত হবে।

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


সম্পাদনা 2:

অবশ্যই, সমাধানটি পূর্ববর্তী সম্পাদনাতে যেমন ইঙ্গিতগুলি অবিরত রয়েছে

এবং নীচে একটি অনুমিত স্থিরীকৃত কোড যা আমি এখানে পেয়েছি =>

অ্যান্ড্রয়েড অ্যাক্সেসিবিলিটি সার্ভিস:

// Simulates an L-shaped drag path: 200 pixels right, then 200 pixels down.
Path path = new Path();
path.moveTo(200,200);
path.lineTo(400,200);

final GestureDescription.StrokeDescription sd = new GestureDescription.StrokeDescription(path, 0, 500, true);

// The starting point of the second path must match
// the ending point of the first path.
Path path2 = new Path();
path2.moveTo(400,200);
path2.lineTo(400,400);

final GestureDescription.StrokeDescription sd2 = sd.continueStroke(path2, 0, 500, false); // 0.5 second

HongBaoService.mService.dispatchGesture(new GestureDescription.Builder().addStroke(sd).build(), new AccessibilityService.GestureResultCallback(){

@Override
public void onCompleted(GestureDescription gestureDescription){
super.onCompleted(gestureDescription);
HongBaoService.mService.dispatchGesture(new GestureDescription.Builder().addStroke(sd2).build(),null,null);
}

@Override
public void onCancelled(GestureDescription gestureDescription){
super.onCancelled(gestureDescription);
}
},null);

তারপরে, আমার সন্দেহ হ'ল: উপরের কোডের জন্য সঠিকভাবে মাউস স্থানাঙ্ক কীভাবে প্রেরণ করুন যে কোনও দিক থেকে টানতে পারে? কিছু ধারণা?


সম্পাদনা 3:

আমি দুটি রুটিন পেয়েছি যা টেনে আনার জন্য ব্যবহৃত হয় তবে তারা ইউআইআউটেশন + ব্যবহার করছেinjectInputEvent() । আফাইক, ইভেন্টের ইনজেকশনটি কেবলমাত্র এমন একটি সিস্টেম অ্যাপে কাজ করে যেমন এখানে এবং এখানে বলা হয়েছে এবং আমি এটি চাই না।

এটি রুটিনগুলি পাওয়া যায়:

তারপরে আমার লক্ষ্য অর্জনের জন্য, আমি মনে করি যে 2 তম রুটিনটি সম্পাদনা 2 তে কোড সহ দেখানো (যুক্তি অনুসরন করে, ইভেন্ট ইনজেকশন বাদ দিয়ে) ব্যবহার করার জন্য আরও বেশি বরাদ্দ করা হয়েছে pictureBox1_MouseDownএবং গতিশীল এবং প্রেরণ pictureBox1_MouseMoveপূরণের জন্য যথাক্রমে সমস্ত সিটি এবং (সি # উইন্ডোজ ফর্ম অ্যাপ্লিকেশন) প্রেরণ করুন রুটিনটি কার্যকর করতে এবং ভরাট এই অ্যারেটি ব্যবহার করতে সেন্টিমিডি করুন। আপনার যদি প্রথম রুটিন সম্পর্কে ধারণা থাকে তবে আমাকে জানান: ডি।Point[]pictureBox1_MouseUp

এই সম্পাদনাটি পড়ার পরে যদি আপনার একটি সম্ভাব্য সমাধান হয় তবে দয়া করে আমাকে একটি উত্তরে দেখান, আমি চেষ্টা করব এবং এই ধারণাটি পরীক্ষা করব।


1
টিমভিউয়ার অ্যাক্সেসযোগ্যতার কাঠামোটি ব্যবহার করছে না, সম্ভবত। তাদের ডিভাইস প্রস্তুতকারকদের সাথে বিশেষ চুক্তি রয়েছে, যার কারণে তাদের পণ্যটি সমস্ত ডিভাইসের জন্য উপলব্ধ নয়।
কমন্সওয়্যার

@ কমন্সওয়্যার আপনাকে ধন্যবাদ তবে আমি মনে করি এটি StrokeDescription.continueStroke()একটি সম্ভাব্য সমাধান হতে পারে। দেখুন অধ্যায় ক্রমাগত ভঙ্গি এখানে
ব্রাউজআর

2
আপনার প্রথম অ্যাপ্রোচ সম্পর্কিত। pictureBox1_MouseDownস্থানাঙ্কগুলি অবশ্যই প্রেরণ করা উচিত নয়। এটি কেবল প্রাথমিক স্থানাঙ্কগুলি সংরক্ষণ করতে হবে এবং তারপরে pictureBox1_MouseUpআপনি তাদের প্রেরণ করুন কারণ এটি মাউস আন্দোলনের সমাপ্তি চিহ্নিত করে
গ্রেগজ

উত্তর:


1

প্রশ্নের 3 সম্পাদনা ভিত্তিক একটি সমাধানের উদাহরণ এখানে ।


সি # উইন্ডোজ থেকে অ্যাপ্লিকেশন " formMain.cs ":

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);
                }
            }
        }
    }
}

অ্যান্ড্রয়েড AccessibilityService" মাইএ্যাক্সেসিবিলিটি সার্ভিস.জভা ":

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);
        }
    }
}

0

আপনি অটোআইটি স্ক্রিপ্টিং ব্যবহার করার চেষ্টা করেছেন ?

আপনি নির্দিষ্ট উইন্ডোজ / স্ক্রিনের মধ্যে স্থানাঙ্কগুলি সংরক্ষণ করতে পারেন। প্যাটার্নটি আঁকতে আপনি মাউসক্লিক চেপে ধরে রাখতে পারেন।

আপনি যদি চান তবে আমার কাছে কিছু উদাহরণ কোড / স্ক্রিপ্ট রয়েছে!


সম্পাদনা করুন:

এই টিউটোরিয়াল অনুযায়ী আপনি সি # তে অটো-আইটি ব্যবহার করতে পারেন।

এই পদক্ষেপগুলি অনুসরণ করুন:

  1. অটো-আইটি ইনস্টল করুন
  2. রেফারেন্স ম্যানেজারে অটো-আইটি রেফারেন্স হিসাবে যুক্ত করুন (AutoItX3.dll)
  3. তারপরে আপনি যে লাইব্রেরি যুক্ত করেছেন তা আমদানি করুন: Using AutoItX3Lib;
  4. 'অটো' নামে নতুন নতুন AutoItX3 অবজেক্ট তৈরি করুন: AutoItX3 auto = new AutoItX3();
  5. আপনি এখন অটো ইট আদেশগুলি কার্যকর করতে পারেন।

এটি একটি মাউসক্লিক কার্যকর করার সম্পূর্ণ উদাহরণ:

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


এর সাহায্যে AutoIt Window Info Toolআপনি যে স্থানাঙ্কগুলি ব্যবহার করতে চান তা পরীক্ষা করতে পারেন।

দয়া করে মনে রাখবেন মাউস স্থানাঙ্কগুলির মধ্যে পার্থক্য রয়েছে:

উদাহরণস্বরূপ: auto.AutoItSetOption("MouseCoordMode", 1)পরম স্ক্রীন স্থানাঙ্ক ব্যবহার করবে। উত্স দেখুন এখানে


মাউসক্লিক চেপে ধরে রাখার জন্য, আপনি মাউসডাউন ফাংশনটি পরীক্ষা করতে পারেন


1
এটি সাহায্য করে না। আপনার পরামর্শটি হ'ল আমার সি # উইন্ডোজ ফর্ম অ্যাপ্লিকেশনটি ইতিমধ্যে তৈরি করেছে।
ব্রাউজর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.