Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MacroStudio

Бесплатное 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 / paff)

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 — несколько действий одновременно

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(Т, е, к, с, т)
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. Пустые строки пропускаются без задержки.

ram — сценарий в несколько нажатий

ram1 { hold W 1s }
ram2 { hold S 1s }
ram3 { tap SPACE 5 }

Блоки выполняются по очереди при каждом новом нажатии горячей клавиши запуска: первое нажатие — ram1, второе — ram2, и так далее. Количество блоков не ограничено. Горячая клавиша Стоп (по умолчанию F7) отменяет выполнение и сбрасывает счётчик — следующий запуск снова начнётся с ram1. Каждый привязанный к горячей клавише ram-скрипт хранит свой собственный счётчик независимо от других.

Защита от невидимых символов

Умные/кавычки-«ёлочки» (" ", часто появляются при копировании из мессенджеров) и неразрывные пробелы автоматически нормализуются перед разбором — они выглядят как обычные символы, но раньше могли незаметно ломать разбор координат или скобок.

Логика подтверждения и запуска скрипта

  1. Написали сценарий в редакторе.
  2. Нажали кнопку — сценарий компилируется и становится активным.
  3. Горячая клавиша (по умолчанию F6) запускает именно его.

Любое редактирование текста после подтверждения сбрасывает активацию. При попытке создать новый скрипт, загрузить другой или выйти из программы с несохранёнными изменениями — появится предупреждение.

Захват координат мыши (F8)

Наведите курсор на нужную точку и нажмите горячую клавишу захвата (по умолчанию 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/ -v

Сборка в EXE

pip 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\

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages