आप माउस क्लिक को सी # में कैसे अनुकरण करते हैं?


128

आप C # winforms अनुप्रयोगों में माउस क्लिक का अनुकरण कैसे करते हैं?


5
आप अधिक जानकारी प्रदान करना चाह सकते हैं ताकि आपको एक उपयोगी उत्तर मिल सके।
एंडी

36
टिप: यदि आपका शीर्षक आपके प्रश्न के समान है, तो शीर्षक रास्ता बहुत लंबा है या प्रश्न रास्ता बहुत छोटा है। इस मामले में यह उत्तरार्द्ध है, आपको किसी को भी एक उपयोगी उत्तर देने के लिए उचित मौका देने के लिए बहुत अधिक संदर्भ देना होगा।
गुफ़ा

जवाबों:


145

मैंने नीचे दिए गए कोड का उत्पादन करने के लिए कई स्रोतों को संयोजित किया है, जिनका मैं वर्तमान में उपयोग कर रहा हूं। मैंने Windows.Forms संदर्भों को भी हटा दिया है ताकि मैं इसे अतिरिक्त संदर्भों के बिना कंसोल और WPF अनुप्रयोगों से उपयोग कर सकूं।

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
@ninjaxelite मैं आपको भेजने का अनुमान लगा रहा हूं 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
मुझे इस कोड के साथ एक त्रुटि मिल रही है: PInvoke फ़ंक्शन 'MyForm! MyForm.Form1 :: mouse_event' के लिए कॉल ने असंतुलित कर दिया है। यह संभव है क्योंकि प्रबंधित PInvoke हस्ताक्षर अप्रबंधित लक्ष्य हस्ताक्षर से मेल नहीं खाता है। जांचें कि PInvoke हस्ताक्षर के कॉलिंग कन्वेंशन और पैरामीटर लक्ष्य अप्रबंधित हस्ताक्षर से मेल खाते हैं। कोई विचार?
अब्दुल्ला

12
आपको एक्स और वाई को संकेत देने की आवश्यकता है।
दिबिज्र

1
आवश्यकताओं के अनुसार पूरी तरह से कर्सर की स्थिति में कुछ बदलाव की आवश्यकता है ...
अनुराग रबाडिया

14

कुछ नियंत्रण, जैसे कि System.Windows.Forms में बटन, एक "PerformClick" तरीका है।


यदि नियंत्रण में PerformClick विधि नहीं है, तो आप एक का विस्तार / जोड़ सकते हैं, बस एक उपयुक्त MouseEventArgs तर्क के साथ OnMouse पर क्लिक करें।
टोनी हॉपकिंसन

8

1
यह अजीब तरह का है कि इसे विज़ुअल स्टूडियो UI परीक्षण नामस्थान में अलग किया गया था, लेकिन मैं किसी भी दिन PInvoke पर ले जाऊंगा कि मुझे घटनाओं को डिवाइस से फ़िल्टर करने की आवश्यकता नहीं है।
kayleeFrye_onDeck

2
ऐसा लगता है कि Visual Studio समुदाय संस्करण इस DLL के साथ शिप नहीं करता है।
CM

2
मैं सिर्फ एक "कोडित UI परीक्षण" परियोजना से DLL पर एक दूसरे को कॉपी करके काम पाने के लिए एक घंटे का समय बिता रहा हूं और जब तक आप "कोडेड यूआई परीक्षण" परियोजना प्रकार का उपयोग नहीं कर रहे हैं, मेरी सलाह है: परेशान मत करो। यहां तक ​​कि जब मैंने सभी डीएलएल की नकल की InvalidUITestExtensionPackageException, तो यह एक फेंक दिया , इसलिए यह एक विशेष परियोजना प्रकार में चलने के बारे में बहुत उधम मचाते हुए लगता है।
Jez

@ जेज - जानने के लिए आसान, धन्यवाद। अभी तक किसी भी मुद्दे को खुद नहीं देखा है, लेकिन अब मुझे कम से कम कुछ पता है; 0)
जंग खाए नाखून

5

मैंने उस कोड की कोशिश की है जो मार्कोस ने पोस्ट किया था और इसने मेरे लिए काम नहीं किया। Y को समन्वित करने के लिए मुझे जो कुछ भी दिया गया था वह कर्सर Y अक्ष पर नहीं चला। नीचे दिया गया कोड काम करेगा यदि आप अपने डेस्कटॉप के बाएं कोने के सापेक्ष कर्सर की स्थिति चाहते हैं, आपके आवेदन के सापेक्ष नहीं।

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

वास्तव में क्लिक करने के लिए मैं केवल mouse_event फ़ंक्शन का उपयोग करता हूं। आप एक्स और वाई दे सकते हैं कि आप क्या निर्देशांक चाहते हैं, मैंने टेक्स्टबॉक्स से मूल्यों का उपयोग किया:

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

यह मेरे लिए सही है, मूल रूप Cursor.Positionसे जहाँ भी आप चाहते हैं माउस कर्सर की स्थिति के लिए पर्याप्त है, तो वास्तविक क्लिक करने के लिए Win32API का उपयोग करें।
Ge Rong

0

वे कुछ की जरूरत है कर रहे हैं मैं की तरह गुंबद बात करने के लिए नहीं देख सकते हैं कीथ या मार्कोस Placona बजाय ठीक वैसी कर

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
Etor Madiv

1
@EtorMadiv जैसा मैंने कहा कि इससे पहले कि यह निर्भर करता है कि आप क्या कोशिश कर रहे हैं ..., क्योंकि अगर आप इसे इस्तेमाल करते हैं जैसे मैंने ऊपर किया था तो आपको नहीं मिलेगाNullReferenceException
WiiMaxx
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.