Arduino



Arduino позволяет эмулировать нажатия клавиш клавиатуры и мыши, в том числе в приложениях, которые блокируют нажатия кликеров.

Работает только с активным окном.
 
Подготовка

  1. Требуется плата Arduino micro или Arduino Leonardo с чипом Atmega 32u4. Заказать можно на Aliexpress.

  2. Скачать и установить Arduino IDE. https://www.arduino.cc/en/software (Windows Win7 and newer)

  3. Скачать и установить драйвер CH341SER.

  4. Открыть Arduino IDE, пункт меню 'Инструменты', выбрать тип платы и порт.

  5. Скопировать код скетча ( автор cirus ) вставить в Arduino IDE, нажать кнопку 'Загрузка'.

Sketch

Код: Выделить всё

#include <Mouse.h>
#include <Keyboard.h>
#include <stdlib.h>

int KEYBOARD_DELAY = 0;
int MOUSE_DELAY = 20;
int MOUSE_MOVE_DELAY = 0;
int MOUSE_MOVE_OFFSET = 5;
int RANDOM_KEY = 0;
int RANDOM_MOUSE = 0;
const int SERIAL_PORT = 9600;
const int SERIAL_DELAY = 100;
#define MAX_BUFFER_SIZE 64
#define led 13

#define SET_DELAY '0'
#define SET_KEYBOARD_DELAY '0'
#define SET_MOUSE_DELAY '1'
#define SET_MOUSE_MOVE_DELAY '2'
#define SET_MOUSE_MOVE_OFFSET '3'
#define SET_RANDOM_KEY '4'
#define SET_RANDOM_MOUSE '5'
#define WAIT '6'
#define GET_SETTINGS '7'

#define PRESS_KEY '1'
#define PRINT_STRING '2'
#define KEY_DOWN '3'
#define KEY_UP '4'
#define MOUSE_MOVE '5'
#define MOUSE_CLICK '6'
#define MOUSE_DOWN '7'
#define MOUSE_UP '8'
#define MOUSE_SCROLL '9'

void setup() {
    Serial.begin(SERIAL_PORT);
    Mouse.begin();
    Keyboard.begin();
    pinMode(led, OUTPUT);
}

void loop()
{
    char buffer[MAX_BUFFER_SIZE];
    int buffPos = 0;
    while (Serial.available() == 0) {
        delayMicroseconds(SERIAL_DELAY);
    }
    while (Serial.available()) {
        if (buffPos < MAX_BUFFER_SIZE - 1) {
            buffer[buffPos++] = Serial.read();
            buffer[buffPos] = '\0';
        }
        else   // буфер переполнен
        {
            while (Serial.available()) {
                int temp = Serial.read();
            }
            digitalWrite(led, HIGH);
            delay(3000); // 3 секунды будет включен светодиод L
            digitalWrite(led, LOW);
        }
    }
    switch (buffer[0]) {
    case SET_DELAY:  // установки паузы для клавиш клавиутуры и мыши
    {
        switch (buffer[1]) {
          case SET_KEYBOARD_DELAY:
              KEYBOARD_DELAY = atoi(&buffer[2]);
              break;
          case SET_MOUSE_DELAY:
              MOUSE_DELAY = atoi(&buffer[2]);
              break;
          case SET_MOUSE_MOVE_DELAY:
              MOUSE_MOVE_DELAY = atoi(&buffer[2]);
              break;
          case SET_MOUSE_MOVE_OFFSET:
              MOUSE_MOVE_OFFSET = atoi(&buffer[2]);
              break;
          case SET_RANDOM_KEY:
              RANDOM_KEY = atoi(&buffer[2]);
              break;
          case SET_RANDOM_MOUSE:
              RANDOM_MOUSE = atoi(&buffer[2]);
              break;     
case WAIT: delay(atoi(&buffer[2])); break; case GET_SETTINGS: Serial.println(String(MOUSE_DELAY) + "|" +String(MOUSE_MOVE_DELAY) + "|" +String(MOUSE_MOVE_OFFSET) + "|" +String(RANDOM_KEY) + "|" +String(RANDOM_MOUSE)); return; } break; } case PRESS_KEY: // нажатие клавиши { char key = atoi(&buffer[1]); Keyboard.press(key); delay(KEYBOARD_DELAY + random(RANDOM_KEY)); Keyboard.release(key); delay(KEYBOARD_DELAY); break; } case PRINT_STRING: // напечатать строку { for (int i = 1; i < buffPos; i++) { Keyboard.write(buffer[i]); delay(KEYBOARD_DELAY + random(RANDOM_KEY)); } break; } case KEY_DOWN: // зажать клавишу { Keyboard.press(atoi(&buffer[1])); delay(KEYBOARD_DELAY + random(RANDOM_KEY)); break; } case KEY_UP: // отпустить клавишу { Keyboard.release(atoi(&buffer[1])); delay(KEYBOARD_DELAY); break; } case MOUSE_MOVE: // переместить курсор мыши { long coordinate = atol(&buffer[3]); // x и y на сколько пикселей нужно сместить курсор long x = coordinate / 65535; long y = coordinate % 65535; // нужно двигать влево/вправо вверх/вниз if (buffer[1] == '-') x = -x; if (buffer[2] == '-') y = -y; // сколько нужно сделать шагов int count_step; float stepX = MOUSE_MOVE_OFFSET, stepY = MOUSE_MOVE_OFFSET; int remainsX = 0, remainsY = 0; // сколько останется в конце if (abs(x) > abs(y)) // если по X больше двигать курсор чем по Y { count_step = abs(x) / MOUSE_MOVE_OFFSET; if (count_step > 0) { if (x < 0)stepX = -MOUSE_MOVE_OFFSET; if (y > 0)stepY = abs(y) / float(count_step); else stepY = y / float(count_step); if (abs(stepY) > MOUSE_MOVE_OFFSET) { if (stepY > 0)stepY = MOUSE_MOVE_OFFSET; else stepY = -MOUSE_MOVE_OFFSET; } } } else { count_step = abs(y) / MOUSE_MOVE_OFFSET; if (count_step > 0) { if (y < 0)stepY = -MOUSE_MOVE_OFFSET; if (x > 0)stepX = abs(x) / float(count_step); else stepX = x / float(count_step); if (abs(stepX) > MOUSE_MOVE_OFFSET) { if (stepX > 0)stepX = MOUSE_MOVE_OFFSET; else stepX = -MOUSE_MOVE_OFFSET; } } } float temp = 0.0; for (int i = 0; i < count_step; i++) // перемещение курсора { if (abs(x) > abs(y)) { int stepY2 = trunc(stepY); temp = temp + (abs(stepY) - trunc(abs(stepY))); if (temp >= 1.0) { if (y > 0)stepY2 = stepY2 + 1.0; else stepY2 = stepY2 - 1.0; temp = temp - 1.0; } remainsX += trunc(abs(stepX)); remainsY += abs(stepY2); Mouse.move(trunc(stepX), stepY2, 0); delay(MOUSE_MOVE_DELAY); } else { int stepX2 = trunc(stepX); temp = temp + (abs(stepX) - trunc(abs(stepX))); if (temp >= 1.0) { if (x > 0)stepX2 = stepX2 + 1.0; else stepX2 = stepX2 - 1.0; temp = temp - 1.0; } remainsX += abs(stepX2); remainsY += trunc(abs(stepY)); Mouse.move(stepX2, trunc(stepY), 0); delay(MOUSE_MOVE_DELAY); } } remainsX = abs(x) - remainsX; remainsY = abs(y) - remainsY; if (x < 0)remainsX = -remainsX; if (y < 0)remainsY = -remainsY; Mouse.move(remainsX, remainsY, 0); // перемещение в конечную точку delay(MOUSE_MOVE_DELAY); break; } case MOUSE_CLICK: // клик кнопкой мыши { Mouse.click(buffer[1]); delay(MOUSE_DELAY + random(RANDOM_MOUSE)); break; } case MOUSE_DOWN: // зажать кнопку мыши { Mouse.press(buffer[1]); delay(MOUSE_DELAY + random(RANDOM_MOUSE)); break; } case MOUSE_UP: // отпустить кнопку мыши { Mouse.release(buffer[1]); delay(MOUSE_DELAY); break; } case MOUSE_SCROLL: // скролл мыши { char wheel = atoi(&buffer[1]); Mouse.move(0, 0, wheel); delay(MOUSE_DELAY); break; } default: break; } Serial.print("ready"); }

 
Использование

Указывайте параметр -Hardware для команд клавиатуры и мыши, и действие будет выполнено как от настоящей клавиатуры / мыши через Arduino.