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.
adres |
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.
goto:
8 Apr 2012 @ 11:59
Naturalnie jest to kod pisany pod Visual Studio, który wykorzystuje specyficzne funkcje tego kompilatora.
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ń