Klikasz? No ba!

Kolejny prosty i przydatny programik, który można szybko napisać w C#. Celem jest symulowanie kliknięć myszką. Zakładając, że z jakiegoś powodu musimy wykonać kilkaset czy kilka tysięcy kliknięć może się okazać niezastąpiony.

Zacznijmy od koniecznej podstawy do dalszych działań. Poniżej znajduje się kompletny kod, który zapewni możliwość manipulacji myszką:

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

namespace MultiClick
{
    public partial class Form1 : Form
    {
        // Ładujemy bibliotekę user32.dll
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

        // Będziemy korzystać z funkcji mouse_event z załadownej biblioteki
        public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
        
        // Będziemy potrzebować kody różnych zdarzeń związnych z myszką
        public enum MouseEventFlags
        {
            LEFTDOWN = 0x00000002,
            LEFTUP = 0x00000004,
            MIDDLEDOWN = 0x00000020,
            MIDDLEUP = 0x00000040,
            MOVE = 0x00000001,
            ABSOLUTE = 0x00008000,
            RIGHTDOWN = 0x00000008,
            RIGHTUP = 0x00000010
        }

        public Form1()
        {
            InitializeComponent();
        }
    }
}

Pierwszą rzeczą, której warto się nauczyć to odczytywanie pozycji kursora. Przyda się to do późniejszego celowania.

Potrzebujemy przycisk i dwa pola tekstowe. Poniższy kod wpisuje współrzędne kursora po kliknięciu przycisku. Oczywiście należy uaktywnić przycisk (np. przechodząc do niego tabulatorem) i wcisnąć spację w momencie, w którym chcemy spisać współrzędne kursora. Można to rozwiązać inaczej, ale ten przykład miał być prosty. Wracając do kodu:

        private void button1_Click(object sender, EventArgs e)
        {
            int X = Cursor.Position.X;
            int Y = Cursor.Position.Y;
            textBox1.Text = X.ToString();
            textBox2.Text = Y.ToString();
        }

Jak już wiemy gdzie chcemy działać myszką – do dzieła. Czas zacząć klikać. Napisałem sobie dwie funkcje.

Za kliknięcie lewym klawiszem odpowiada funkcja LeftClick, która przyjmuje jako argumenty współrzędne punktu.

        public static void LeftClick(int x, int y)
        {
            // Ustawiamy kursor w punkcie x, y
            Cursor.Position = new System.Drawing.Point(x, y);
            // Symulujemy wcisnięcie lewego przycisku myszy
            mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
            // Symulujemy puszczenie lewego przycisku myszy
            mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
        }

Za przeciągnięcie elementu odpowiada funkcja LeftDrag, która przyjmuje jako argumenty współrzędne dwóch punktów.

        public static void LeftDrag(int x, int y, int x2, int y2)
        {
            Cursor.Position = new System.Drawing.Point(x, y);
            mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
            Cursor.Position = new System.Drawing.Point(x2, y2);
            mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
        }

Teraz wystarczy skleić powyższe kawałki kodu i napisać program (kod), który będzie klikał. Ja dla przykładu utworzyłem przycisk, którego kliknięcie spowoduje narysowanie “rysunku” w paincie:

Kod potrzebny do wygenerowania rysunku wygląda następująco:

        private void button2_Click(object sender, EventArgs e)
        {
            LeftDrag(300, 300, 300, 480);
            LeftDrag(300, 480, 480, 480);
            LeftDrag(480, 480, 480, 300);
            LeftDrag(480, 300, 300, 300);
            for (int x = 0; x < 18; x++)
            {
                for (int y = 0; y < 18; y++)
                {
                    LeftClick(300 + y * 10, 300 + x * 10);
                }
            }
        }

I to tyle. Dalsze wariacje w temacie zostawiam czytelnikom.

|

Komentarze (3) »

  1. Champi:

    30 Mar 2012 @ 19:53

    Czesc.

    Trochę późno kompetuje twój art, ale natrafiłem na niego niedawno. Może dwa dni temu. Nosze się z zamiarem napisania podobnego programu. Ciekawi mnie tylko jakiego kompilatora używałeś przy pisaniu tego programku. Czy musi to być jakieś wielki “kombain” w stylu “Visual Studio…” czy wystarczy zwykły kompilator pod C++.

    Dzięki z góy za odpowiedź.
    Champi.

  2. goto:

    8 Apr 2012 @ 11:59

    Naturalnie jest to kod pisany pod Visual Studio, który wykorzystuje specyficzne funkcje tego kompilatora.

  3. uczeń:

    20 Sep 2012 @ 10:58

    Wszystko fajnie jest opisane ale po połączeniu cały czas mi robi błąd jak ma nacisnąć lewy przycisk – system wyświetla błąd o treści:
    “Wywołanie funkcji PInvoke ‘Klikacz myszkowy!Klikacz_myszkowy.Form1::mouse_event’ zachwiało równowagą stosu. Prawdopodobna przyczyna to niedopasowanie zarządzanego podpisu funkcji PInvoke i niezarządzanego podpisu docelowego. Sprawdź, czy konwencja wywołania i parametry podpisu funkcji PInvoke pasują do niezarządzanego podpisu docelowego.”
    Proszę o pomoc Uczeń

RSS komentarzy · adres TrackBack

Odpowiedz