আমি কীভাবে এক্স, ওয়াই মাউস স্থানাঙ্কের ভিত্তিতে অ্যান্ড্রয়েডের উপর একটি টানা প্রদর্শন করতে পারি তা জানতে চাই? দুটি সহজ উদাহরণ হিসাবে বিবেচনা করুন, টিম ভিউয়ার / কুইকসপোর্ট যথাক্রমে দূরবর্তী স্মার্টফোনে এবং "উইন্ডোজ পেইন্ট অফ উইন্ডোজ পেইন্ট" এ "পাসওয়ার্ডের প্যাটার্ন" আঁকেন।
আমি যা করতে সক্ষম তা হ'ল সিমুলেট টাচ (সাথে 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
এই সম্পাদনাটি পড়ার পরে যদি আপনার একটি সম্ভাব্য সমাধান হয় তবে দয়া করে আমাকে একটি উত্তরে দেখান, আমি চেষ্টা করব এবং এই ধারণাটি পরীক্ষা করব।
StrokeDescription.continueStroke()
একটি সম্ভাব্য সমাধান হতে পারে। দেখুন অধ্যায় ক্রমাগত ভঙ্গি এখানে ।
pictureBox1_MouseDown
স্থানাঙ্কগুলি অবশ্যই প্রেরণ করা উচিত নয়। এটি কেবল প্রাথমিক স্থানাঙ্কগুলি সংরক্ষণ করতে হবে এবং তারপরে pictureBox1_MouseUp
আপনি তাদের প্রেরণ করুন কারণ এটি মাউস আন্দোলনের সমাপ্তি চিহ্নিত করে