Бесплатное desktop-приложение для Windows с собственным языком сценариев для автоматизации клавиатуры и мыши. Пишешь короткий скрипт, привязываешь к горячей клавише — и он повторяет твои действия с точным таймингом, каждый раз одинаково.
🔗 Сайт: https://macrostudioapp.netlify.app 📦 Скачать: https://github.com/Nesttio/MacroStudio/releases 💬 Discord: https://discord.gg/heWThrvfQ7
Установщик пока не подписан цифровой подписью (платный сертификат, на который пока нет бюджета) — Windows SmartScreen может показать предупреждение при первом запуске. Нажми "Подробнее" → "Выполнить в любом случае". Файл чист — проверено на VirusTotal, хэш есть в релизе на GitHub.
move "500,400"
tap LMB 1
wait 0.3s
text(H, e, l, l, o)
wait 0.5s
hold SPACE 1s
Кликает в точку (500, 400), ждёт, печатает "Hello", ждёт ещё, и держит пробел секунду. Полное описание языка — ниже, в разделе "Язык сценариев".
MacroStudio/
├── main.py # точка входа
├── requirements.txt
├── conftest.py
├── core/
│ ├── lexer.py # токенизатор языка сценариев
│ ├── parser.py # парсер (hold/tap/wait/move/together/row/paff/text/ram)
│ ├── executor.py # исполнение AST (потоки, pynput)
│ ├── estimator.py # расчёт времени выполнения без запуска
│ ├── dryrun.py # текстовое описание "что будет выполнено"
│ ├── hotkeys.py # глобальные горячие клавиши
│ ├── input_blocker.py # блокировка ввода во время выполнения (Windows)
│ ├── script_registry.py # индивидуальные бинды для сохранённых скриптов
│ ├── logger.py # логирование в файл + GUI
│ ├── i18n.py # переводы интерфейса (8 языков)
│ ├── winapi.py # тёмный заголовок окна, AppUserModelID (Windows)
│ ├── timing.py # общие тайминги (TAP_GAP, скорость мыши)
│ └── settings.py # настройки (JSON в %USERPROFILE%/.macrostudio)
├── gui/
│ ├── main_window.py # главное окно, кнопки, лог/ошибки/проверка, трей
│ ├── editor.py # редактор кода: номера строк, автодополнение
│ ├── highlighter.py # подсветка синтаксиса (оптимизированные regex)
│ ├── help_page.py # справка (одна страница, эмодзи-иконки)
│ ├── settings_page.py # настройки (единая прокручиваемая страница)
│ ├── script_settings_dialog.py # индивидуальные настройки скрипта (бинд, блокировка ввода, своя скорость)
│ ├── script_manager.py # список сохранённых скриптов + бинды
│ ├── new_script_card.py # карточка создания нового скрипта
│ ├── toggle_switch.py # переключатель on/off, используется в индивидуальных настройках
│ ├── overlay.py # модальная плашка поверх окна (вместо отдельных диалогов)
│ ├── icons.py # набор иконок, рисуемых QPainter
│ └── key_capture.py # диалог захвата нажатой клавиши для бинда
├── tests/ # pytest-тесты на язык и расчёт времени
└── resources/
└── style.qss # тёмная тема (единственная)
| Запись | Что делает |
|---|---|
hold W 20s |
Удерживать клавишу W 20 секунд |
tap SPACE 20 |
Нажать пробел 20 раз (пауза 0.01с между нажатиями — автоматически) |
wait 1.5s |
Подождать 1.5 секунды |
move "1200,650" |
Мгновенно переместить курсор в точку |
tap LMB 20 at "1200,650" |
Переместиться в точку и кликнуть 20 раз |
hold RMB 0.5s at "800,400" |
Переместиться и удерживать правую кнопку 0.5с |
tap RMB auto 10s |
Быстрый клик правой кнопкой в течение 10с (только LMB/RMB) |
Вместо LMB/RMB в at-командах можно использовать любую клавишу, включая
символьные (/, ., -, ', `, [, ], \):
hold E 2s at "800,400", tap F 10 at "500,300", hold / 0.2s.
row intro = hold W 20s
paff("intro")
paff("intro"*10) # 10 повторов, пауза 0.01с между ними
paff(("intro"*10)*10) # 100 повторов (вложенные группы)
paff(hold A 20s) # можно использовать команду напрямую, без row
Переменная не может содержать другую переменную — это ошибка. Команда
row во время выполнения не выполняется, это просто объявление.
together { hold W 1s; hold D 1s }
Все команды внутри запускаются в один момент. Нельзя использовать одну
и ту же клавишу дважды в одном блоке — проверка работает и через
переменные (row/paff), а не только для команд, написанных напрямую.
Поддерживается любое количество команд в одном блоке.
Точные правила:
waitиmoveстартуют сразу вместе со всеми остальными командами блока.tapцентрируется по времени внутри самого длинногоholdв этом же блоке — например, вtogether { hold W 2s; tap LMB 5 }пять кликов происходят точно в середине двухсекундного удержания W, а не в начале. Если в блоке нетholdдлиннее, чем самtap, он просто стартует сразу, как и всё остальное. То же самое верно и дляtap KEY auto Ns.- Команды с
atсначала перемещают курсор (мгновенно или с настроенной в Настройках скоростью), затем выполняют действие — как и везде в языке. paffвнутриtogetherподчиняется тем же правилам, что и обычная переменная — где угодно, где ожидается действие.
text(Т, е, к, с, т)
text(H, e, l, l, o, SPACE, W, o, r, l, d)
Нажимает перечисленные символы по очереди, каждый один раз. Внутри
text(...) можно использовать не только буквы, но и именованные
клавиши (SPACE, ENTER, TAB...) и символьные клавиши.
Любая команда (hold, tap, at, together, внутри text, в
row/paff) принимает: буквы, цифры, F1–F24, именованные клавиши
(SPACE, ENTER, CTRL, LMB...) и символьные клавиши клавиатуры —
/, ., -, ', `, [, ], \. Одни и те же правила работают
одинаково везде в языке, без исключений.
Между любыми двумя последовательными командами (не внутри together —
там всё по-прежнему одновременно) программа автоматически выдерживает
паузу 0.01 секунды. Это защищает от ситуаций, когда система не
успевает обработать быстро идущие подряд нажатия клавиш/клика мыши.
Отдельно вставлять wait 0.01s между командами не нужно — это уже
учтено и в расчёте времени выполнения.
# делает весь текст после себя комментарием: hold W 1s # держим W.
Пустые строки пропускаются без задержки.
ram1 { hold W 1s }
ram2 { hold S 1s }
ram3 { tap SPACE 5 }
Блоки выполняются по очереди при каждом новом нажатии горячей клавиши
запуска: первое нажатие — ram1, второе — ram2, и так далее.
Количество блоков не ограничено. Горячая клавиша Стоп (по умолчанию
F7) отменяет выполнение и сбрасывает счётчик — следующий запуск
снова начнётся с ram1. Каждый привязанный к горячей клавише
ram-скрипт хранит свой собственный счётчик независимо от других.
Умные/кавычки-«ёлочки» (" ", часто появляются при копировании из
мессенджеров) и неразрывные пробелы автоматически нормализуются перед
разбором — они выглядят как обычные символы, но раньше могли незаметно
ломать разбор координат или скобок.
- Написали сценарий в редакторе.
- Нажали кнопку → — сценарий компилируется и становится активным.
- Горячая клавиша (по умолчанию F6) запускает именно его.
Любое редактирование текста после подтверждения сбрасывает активацию. При попытке создать новый скрипт, загрузить другой или выйти из программы с несохранёнными изменениями — появится предупреждение.
Наведите курсор на нужную точку и нажмите горячую клавишу захвата (по умолчанию F8). Координаты копируются в буфер обмена и выводятся в лог/терминал — без всплывающих окон внутри программы.
В "Меню скриптов" у каждого сохранённого скрипта может быть своя горячая клавиша, работающая всегда, независимо от того, что открыто в редакторе. Проверка конфликтов — при попытке назначить уже занятую клавишу программа предупредит. Захват клавиши — простым нажатием (зажмите модификатор, нажимайте нужную вторую клавишу сколько угодно раз, подтвердите кнопкой "Сохранить").
Кнопка со значком настроек рядом с "+" (новый скрипт) на панели вкладок открывает индивидуальные настройки для скрипта, открытого в текущей вкладке:
- Горячая клавиша — то же самое, что и в "Меню скриптов", доступно прямо здесь.
- Отключить управление во время выполнения — клавиатура и мышь блокируются, пока этот скрипт работает; клавиша Стоп всегда действует, даже при блокировке.
- Своя скорость мыши и кликов — когда включено, этот скрипт использует собственную скорость движения мыши и паузы между кликами ЛКМ/ПКМ вместо глобальных значений из "Настройки". При первом включении поля подставляют текущие глобальные значения — дальше их можно менять независимо от остальных скриптов.
Настройки сохраняются отдельно для каждого скрипта (по имени файла) и не влияют на остальные.
Диалог настроек разбит на разделы (слева список, справа поля):
- Общие — размер шрифта редактора.
- Горячие клавиши — Запуск, Стоп, Захват координат, Подтвердить (→), Вкл/выкл бинды скриптов — у каждой есть короткое описание того, что она делает. Назначаются нажатием клавиш, а не вводом текста.
- Язык — список всех 8 языков интерфейса, выбор сразу виден и применяется мгновенно, без перезапуска: русский, English, українська, español, français, Deutsch, português, 中文.
- Дополнительно — скорость движения мыши: число от 0 до 30. 0 — очень медленно, курсор плавно едет к точке. Чем выше число, тем быстрее движение; 30 — мгновенно (курсор телепортируется, поведение по умолчанию, как описано в языке).
Смена языка применяется мгновенно во всём интерфейсе, включая уже открытые окна, ещё до нажатия "Сохранить". Оформление — единая тёмная тема.
Требуется Python 3.10+ на Windows.
cd MacroStudio
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
python main.pyПри первом запуске откроется обучение. Горячие клавиши работают даже когда окно свёрнуто в трей. Полный выход — через пункт "Выход" в меню иконки трея.
pip install pytest
pytest tests/ -vpip install pyinstaller
pyinstaller --noconfirm --windowed --onefile --name MacroStudio --add-data "resources;resources" main.pyГотовый файл — dist\MacroStudio.exe, запускается напрямую, без
установщика.
%USERPROFILE%\.macrostudio\
├── settings.json
├── scripts\
│ ├── *.ms
│ └── _bindings.json
├── backups\
└── logs\