Пишем свой Кликер (Mouse Mover) — Компьюпико.ком

Пишем свой Кликер (Mouse Mover)

Выдали рабочий ноутбук на котором заблокирована настройка параметров гибернации. Но вот беда, время уже нерабочее, а нужно дождаться когда придет письмо от начальника и быстро на него среагировать. Сидеть половину вечера и шевелить мышку — не вариант! Выход есть, завариваем чай или кофе и быстренько пишем свой маус кликер\маус мувер под Windows. Будем использовать VisualStudio, .Net и C#.

План действий

Всё довольно просто:

  1. Открываем (или устанавливаем) VisualStudio Community
  2. Создаём проект Windows Forms (.Net, C#)
  3. Добавляем на форму timer1
  4. Редактируем исходный код программы как показано ниже
 public partial class Form1 : Form
    {
        System.Drawing.Pen          myPen;
        System.Drawing.Graphics     formGraphics;
        Random                      rnd = new Random();
        bool                        programClick = false;
        int                         x = 0;
        int                         y = 0;
        int                         a = 0;

        [DllImport("User32.dll")] 
        static extern void mouse_event(MouseFlags dwFlags, int dx, int dy, int dwData, UIntPtr dwExtraInfo);
  
        [Flags]
        enum MouseFlags
        {
            Move = 0x0001, LeftDown = 0x0002, LeftUp = 0x0004, RightDown = 0x0008,
            RightUp = 0x0010, Absolute = 0x8000
        };

        public Form1()
        {
            InitializeComponent();
        }

        Point getCursorCircleCoords(int _x, int _y, int _a, int _R) 
        {
            double a = (_a * Math.PI) / 180;    
            Point cursorCoords = new Point();
            cursorCoords.X = (int)(Math.Round(_R * Math.Cos(a)) + _x);
            cursorCoords.Y = (int)(Math.Round(_R * Math.Sin(a)) + _y);
            return cursorCoords; 
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            a++;
            if (a >= 360)
            {
                a = 0;
                myPen.Color = Color.FromArgb(rnd.Next(255), rnd.Next(255), rnd.Next(255));
                label1.ForeColor = myPen.Color;

                programClick = true;
                try
                {
                    mouse_event(MouseFlags.LeftDown, x, y, 0, UIntPtr.Zero);
                    mouse_event(MouseFlags.LeftUp, x, y, 0, UIntPtr.Zero);
                }
                catch (Exception ex)
                {
                    timer1.Enabled = false;
                    MessageBox.Show(ex.ToString());
                }
            }

            try
            {
                x = getCursorCircleCoords(125, 75, a, 30).X;
                y = getCursorCircleCoords(125, 75, a, 30).Y;

                Cursor.Position = new Point(this.Left + x, this.Top + y);
                formGraphics.DrawLine(myPen, x - 8, y - 22, x - 9, y - 19);
            }
            catch (Exception ex)
            {
                timer1.Enabled = false;
                MessageBox.Show(ex.ToString());
            }
        }
        
        public void stopStartTimer()
        {
            if (timer1.Enabled)
            {
                if (!programClick)
                {
                    timer1.Enabled = false;
                    label1.Text = "Click to start";
                }else
                {
                    programClick = false;
                    mouse_event(MouseFlags.LeftDown, x, y, 0, UIntPtr.Zero);
                    mouse_event(MouseFlags.LeftUp, x, y, 0, UIntPtr.Zero);
                }
            }
            else
            {                
                if (formGraphics == null) { formGraphics = this.CreateGraphics(); }
                if (myPen == null) { myPen = new System.Drawing.Pen(System.Drawing.Color.SteelBlue); }
                timer1.Enabled = true;
                label1.Text = "Click to stop";
            }
        }

        private void Form1_Click(object sender, EventArgs e)
        {
            stopStartTimer();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (formGraphics != null) { formGraphics.Dispose(); }
            if (myPen != null) { myPen.Dispose(); }
        }

        private void label1_Click(object sender, EventArgs e)
        {
            stopStartTimer();
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
           linkLabel1.LinkVisited = true;
           System.Diagnostics.Process.Start("http://www.compupico.com");
        }

Копилируем, запускаем, получаем вот такую программку(см. скриншот ниже), которая водит курсор по кругу не давая нутбуку уснуть.

Compupico Mouse Mover (Clicker)
Mouse Mover в действии

Пояснения к коду

  1. Объявление переменных. Здесь должно быть всё понятно. Pen и Graphics для работы с графикой, Random для работы со случайными числами и несколько вспомогательных переменных.
  2. Дальше немного сложнее
[DllImport("User32.dll")] 
static extern void mouse_event(MouseFlags dwFlags, int dx, int dy, int dwData, UIntPtr dwExtraInfo);

Производим импорт функции mouse_event из WinAPI для эмуляции нажатия кнопок мыши.

   enum MouseFlags

Содержит перечисление флагов для управления мышью

3. Функция Point getCursorCircleCoords(int _x, int _y, int _a, int _R) вычисляет координаты точки по окружности (центр в _x_y, радиус _R, угол _a).

4. Метод timer1_Tick

  • Увеличивает угол a, перемещает курсор по окружности
  • После полного круга (360°) меняет цвет пера и текста, кликает мышью
  • Рисует линию в текущей позиции курсора

5. Метод stopStartTimer

  • Включает\выключает таймер
  • Если метод вызван не в результате клика пользователя, имитирует клик по форме

6. Метод Form1_Click Включает\выключает таймер через метод stopStartTimer()

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *