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.