Выдали рабочий ноутбук на котором заблокирована настройка параметров гибернации. Но вот беда, время уже нерабочее, а нужно дождаться когда придет письмо от начальника и быстро на него среагировать. Сидеть половину вечера и шевелить мышку — не вариант! Выход есть, завариваем чай или кофе и быстренько пишем свой маус кликер\маус мувер под Windows. Будем использовать VisualStudio, .Net и C#.
План действий
Всё довольно просто:
- Открываем (или устанавливаем) VisualStudio Community
- Создаём проект Windows Forms (.Net, C#)
- Добавляем на форму timer1
- Редактируем исходный код программы как показано ниже
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");
}
Копилируем, запускаем, получаем вот такую программку(см. скриншот ниже), которая водит курсор по кругу не давая нутбуку уснуть.

Пояснения к коду
- Объявление переменных. Здесь должно быть всё понятно. Pen и Graphics для работы с графикой, Random для работы со случайными числами и несколько вспомогательных переменных.
- Дальше немного сложнее
[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()