আপনি সি # তে মাউস ক্লিকটি কীভাবে অনুকরণ করবেন?


128

আপনি কীভাবে সি # উইনফর্ম অ্যাপ্লিকেশনগুলিতে মাউস ক্লিকগুলি অনুকরণ করবেন?


5
আপনি আরও তথ্য সরবরাহ করতে চাইতে পারেন যাতে আপনি একটি দরকারী উত্তর পেতে পারেন।
অ্যান্ডি

36
টিপ: আপনার শিরোনাম যদি আপনার প্রশ্নের মতো হয় তবে শিরোনামটি বেশ দীর্ঘ বা প্রশ্নটি খুব ছোট। এক্ষেত্রে এটি পরেরটি, আপনার পক্ষে একটি দরকারী উত্তর দেওয়ার যুক্তিসঙ্গত সুযোগ পাওয়ার জন্য আপনাকে অনেক বেশি প্রসঙ্গ দিতে হবে।
গুফা

উত্তর:


145

নীচের কোডটি তৈরি করতে আমি বেশ কয়েকটি উত্সকে একত্রিত করেছি, যা আমি বর্তমানে ব্যবহার করছি। আমি উইন্ডোজ.ফর্মগুলির রেফারেন্সগুলিও সরিয়েছি যাতে আমি এটি অতিরিক্ত রেফারেন্স ছাড়াই কনসোল এবং ডাব্লুপিএফ অ্যাপ্লিকেশনগুলি থেকে ব্যবহার করতে পারি।

using System;
using System.Runtime.InteropServices;

public class MouseOperations
{
    [Flags]
    public enum MouseEventFlags
    {
        LeftDown = 0x00000002,
        LeftUp = 0x00000004,
        MiddleDown = 0x00000020,
        MiddleUp = 0x00000040,
        Move = 0x00000001,
        Absolute = 0x00008000,
        RightDown = 0x00000008,
        RightUp = 0x00000010
    }

    [DllImport("user32.dll", EntryPoint = "SetCursorPos")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetCursorPos(int x, int y);      

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetCursorPos(out MousePoint lpMousePoint);

    [DllImport("user32.dll")]
    private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

    public static void SetCursorPosition(int x, int y) 
    {
        SetCursorPos(x, y);
    }

    public static void SetCursorPosition(MousePoint point)
    {
        SetCursorPos(point.X, point.Y);
    }

    public static MousePoint GetCursorPosition()
    {
        MousePoint currentMousePoint;
        var gotPoint = GetCursorPos(out currentMousePoint);
        if (!gotPoint) { currentMousePoint = new MousePoint(0, 0); }
        return currentMousePoint;
    }

    public static void MouseEvent(MouseEventFlags value)
    {
        MousePoint position = GetCursorPosition();

        mouse_event
            ((int)value,
             position.X,
             position.Y,
             0,
             0)
            ;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct MousePoint
    {
        public int X;
        public int Y;

        public MousePoint(int x, int y)
        {
            X = x;
            Y = y;
        }
    }
}

2
আমি 17 মাস আগে মার্কোস প্ল্যাঙ্কোনা যা পোস্ট করেছি তার দীর্ঘতর উত্স কোডটির কোনও সুবিধা দেখতে পাচ্ছি না।
আল কেপ

46
প্রশ্নের অস্পষ্টতা দেখে আমি ভেবেছিলাম যে লোকেদের এমন একটি উদাহরণ থেকে উপকৃত হতে পারে যা তাদের ডান বা মধ্য ক্লিক ক্লিক করে বা ক্লিক করতে এবং টেনে আনতে কেবল বাম ক্লিকের চেয়ে বেশি কিছু করতে দেয়।
কিথ

2
দুর্দান্ত কাজ করে। আমি এখানে এরকম কিছু সন্ধান করতে এসেছি
CSharpie

এটি আমি অনুসন্ধান করছি, তবে আপনি কীভাবে নীচে ক্লিক করবেন, মাউসকে অন্য কোথাও সরান এবং তারপরে ছেড়ে দেবেন ??
নিনজাক্সিলাইট

1
@ নিনজ্যাক্সেলাইট আমি অনুমান করছি যে আপনি পাঠিয়েছেন 1. SetCursorPos, 2. MouseEvent(LeftButtonDown), 3. SetCursorPos, 4. MouseEvent(LeftButtonUp)। সম্ভবত এটি কোনও সহায়ক পদ্ধতিতে মোড়ানো
মিশাল সিচান

137

একটি উদাহরণ আমি দেখেছি কোথাও এখানে অতীতে। কিছু সাহায্য হতে পারে:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class Form1 : Form
{
   [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
   public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);
   //Mouse actions
   private const int MOUSEEVENTF_LEFTDOWN = 0x02;
   private const int MOUSEEVENTF_LEFTUP = 0x04;
   private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
   private const int MOUSEEVENTF_RIGHTUP = 0x10;

   public Form1()
   {
   }

   public void DoMouseClick()
   {
      //Call the imported function with the cursor's current position
      uint X = (uint)Cursor.Position.X;
      uint Y = (uint)Cursor.Position.Y;
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
   }

   //...other code needed for the application
}

12
কোথাও সম্ভবত এখানে ?
এমপেন

3
ভালো খেলেছ. মূল উত্তরের সাথে উল্লেখ যুক্ত করা হয়েছে
মার্কোস প্লকোনা

2
এই কোডটির সাথে আমি একটি ত্রুটি পাচ্ছি: পিনভোক ফাংশনটিতে 'মাইফর্ম! মাইফর্ম.ফর্ম 1 :: মাউস_ভেন্য্ট' স্ট্যাকটিকে ভারসাম্যহীন করে দিয়েছে। এটি সম্ভবত কারণ পরিচালনা পিনভোক স্বাক্ষরটি পরিচালনা না করা লক্ষ্য স্বাক্ষরের সাথে মেলে না। কলিং কনভেনশন এবং পিনভোক স্বাক্ষরের প্যারামিটারগুলি লক্ষ্যহীন পরিচালনা না করা স্বাক্ষরের সাথে মেলে Check কোন ধারনা?
আব্দুল্লা

12
আপনাকে এক্স এবং ওয়াইতে ইশারা দেওয়ার দরকার পড়ে।
দিবসজর

1
প্রয়োজন অনুসারে কার্সার পজিশনে কিছুটা পরিবর্তন দরকার নিখুঁতভাবে ...
অনুরাগ রাবাদিয়া

14

সিস্টেমের উইন্ডোজ.ফর্মগুলির বোতামের মতো কিছু নিয়ন্ত্রণের ঠিক এটি করতে একটি "পারফর্ম ক্লিক" পদ্ধতি রয়েছে।


যদি নিয়ন্ত্রণটির পারফরমিক্লিক পদ্ধতি না থাকে তবে আপনি একটি প্রসারিত / যুক্ত করতে পারেন, কেবলমাত্র উপযুক্ত মাউসএভেন্টআর্গ আর্গুমেন্টের সাথে অনমাউস ক্লিককে কল করতে হবে।
টনি হপকিনসন

8

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

2
দেখে মনে হচ্ছে ভিজ্যুয়াল স্টুডিও সম্প্রদায় সংস্করণটি এই ডিএলএল দিয়ে পাঠায় না।
সিএম

2
আমি "কোডড ইউআই টেস্ট" প্রকল্পের থেকে অন্য একটিতে ডিএলএল অনুলিপি করে কাজটি করার জন্য এক ঘন্টা সময় ব্যয় করেছি এবং আপনি যদি একটি "কোডেড ইউআই পরীক্ষা" প্রকল্পের ধরণ না ব্যবহার করেন তবে আমার পরামর্শটি হ'ল: বিরক্ত হবেন না। এমনকি যখন আমি সমস্ত ডিএলএলগুলি অনুলিপি করেছিলাম তখন এটি ছুঁড়েছিল InvalidUITestExtensionPackageException, তাই দুঃখের সাথে একটি নির্দিষ্ট প্রকল্পের ধরণে চালানো সম্পর্কে অত্যন্ত উদ্বেগজনক বলে মনে হচ্ছে।
জেজ

@ জেজ - ধন্যবাদ জানার জন্য ধন্যবাদ আমি এখনও কোনও সমস্যা দেখিনি, তবে এখন আমি কমপক্ষে কিছু উপস্থিত রয়েছে তা জানি; 0)
মরিচা পেরেক

5

মার্কোস যে পোস্ট করেছে তা আমি চেষ্টা করেছি এবং এটি আমার পক্ষে কার্যকর হয়নি। আমি ওয়াইয়ের সমন্বয়কে যা কিছু দেওয়া হয়েছিল তা কার্সার ওয়াই অক্ষের উপরে সরেনি। নীচের কোডটি যদি আপনার ডেস্কটপের বাম দিকের কোণটির সাথে সম্পর্কিত, আপনার আবেদনের সাথে সম্পর্কিত না হয় তবে কার্সারের অবস্থান চাইলে কাজ করবে।

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
    private const int MOUSEEVENTF_LEFTDOWN = 0x02;
    private const int MOUSEEVENTF_LEFTUP = 0x04;
    private const int MOUSEEVENTF_MOVE = 0x0001;

    public void DoMouseClick()
    {
        X = Cursor.Position.X;
        Y = Cursor.Position.Y;

        //move to coordinates
        pt = (Point)pc.ConvertFromString(X + "," + Y);
        Cursor.Position = pt;       

        //perform click            
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    }

আমি কেবল ক্লিক সম্পাদন করতে কেবল মাউস_ভেন্ত ফাংশনটি ব্যবহার করি। আপনি এক্স এবং ওয়াইকে যা স্থানাঙ্ক চান তা দিতে পারেন, আমি পাঠ্যবাক্স থেকে মানগুলি ব্যবহার করেছি:

            X = Convert.ToInt32(tbX.Text);
            Y = Convert.ToInt32(tbY.Text);

এটি আমার জন্য সঠিক। মূলত Cursor.Positionমাউস কার্সারটি যেখানেই আপনি চান সেখানে অবস্থানের জন্য যথেষ্ট ভাল, তবে আসল ক্লিক করতে WIN32API ব্যবহার করুন।
জি রং

0

এগুলি এমন কিছু প্রয়োজন যা আমি গম্বুজের মতো দেখতে পাচ্ছি না যেমন কিথ বা মার্কোস প্লাঙ্কোনা কেবল না করার পরিবর্তে করেছিল

using System;
using System.Windows.Forms;

namespace WFsimulateMouseClick
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            button1_Click(button1, new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 1, 1, 1));

            //by the way
            //button1.PerformClick();
            // and
            //button1_Click(button1, new EventArgs());
            // are the same
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("clicked");
        }
    }
}

1
আপনার যদি এই পরামিতিগুলির কোনওটির প্রয়োজন না হয় তবে আপনি বাটন 1_ ক্লিক করুন (নাল, নাল )ও করতে পারেন।
sab669

@ sab669 নিশ্চিত তবে এটি এখনও তার প্রয়োজনীয়তার উপর নির্ভর করে :-)
WiiMaxx

আপনার nullদ্বিতীয় প্যারামিটারে ব্যবহার করা উচিত নয় , এটি একটি নিক্ষেপ করবে NullReferenceException, পরিবর্তে ব্যবহার করবেEventArgs.Empty
এটোর মাদিভ

1
@ এটোরমাডিভ যেমন আমি বলেছিলাম যে আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে ... কারণ আপনি যদি এটির উপরে ব্যবহার করেন তবে আপনি একটি পাবেন নাNullReferenceException
WiiMaxx
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.