Центрирование окна в Windows с AutoHotKey

Не раздражает ли вас, что окна в Windows иногда появляются в самых неожиданных местах экрана? Если вы хотите быстро и предсказуемо размещать текущее окно по центру экрана — это можно автоматизировать с помощью AutoHotKey. В этом руководстве вы получите понятный план, готовый скрипт и практические советы по использованию и отладке.
Зачем это нужно
- Быстро привести диалоговые окна и приложения в фокус без мыши.
- Избежать лишнего поиска нужного окна на широких или нескольких мониторах.
- Удобно при демонстрациях, удалённой поддержке и работе с окнами, которые часто открываются в произвольных позициях.
Важно: скрипт центрирует активное окно по запросу (горячая клавиша), а не насильственно на каждое открытие — это снижает риск помешать полноэкранным приложениям и играм.
Ключевая идея (в двух строках)
Определяем размеры активного окна и размеры экрана, вычисляем координаты так, чтобы окно оказалось по центру, затем вызываем команду WinMove для перемещения.
Одно предложение — что будет в конце
Вы получите рабочий AutoHotKey-скрипт: по нажатию CTRL+Y активное окно перемещается в центр основного экрана. Скрипт легко изменить под другую комбинацию клавиш или расширить для нескольких мониторов.
План действий — сначала мысль, затем код
Ниже — пошаговый план, который затем будет прямо преобразован в код:
- Назначить горячую клавишу для активации функции.
- Получить заголовок активного окна и его размеры.
- Узнать размеры экрана (AutoHotKey хранит их в переменных A_ScreenWidth/A_ScreenHeight).
- Вычислить координаты TargetX и TargetY для центрального положения.
- Вызвать WinMove с этими координатами.
- Добавить простую логику для переключения между мониторами (опционально).
Установка AutoHotKey и создание скрипта
- Скачайте установщик AutoHotKey с официального сайта и установите «current» (не v2-beta и не устаревшую 1.0, если хотите стабильности текущих релизов).
- Откройте Проводник (Win+E) и в нужной папке правой кнопкой выберите New > AutoHotKey Script.
- Дайте файлу понятное имя, затем правой кнопкой Edit Script (или открыть в VS Code/Notepad++).
- Если используете обычный Блокнот, сохраняйте как файл с расширением .ahk (не .txt).
Совет: не используйте Wordpad — он может добавить форматирование, мешающее работе скрипта.
Минимальная структура горячей клавиши
Сначала привяжем функцию к клавише. AutoHotKey использует специальные обозначения: + = Shift, ^ = Ctrl, ! = Alt, # = Win. Пример — привязка к Ctrl+Y:
^y::
; Место для кода
return
Двойные двоеточия :: отделяют триггер от тела обработчика. Строка return завершает обработчик.
Получаем данные активного окна
Замените комментарий в теле горячей клавиши на команды, которые получают заголовок и размеры окна:
WinGetTitle, ActiveWindowTitle, A
WinGetPos,,, Width, Height, %ActiveWindowTitle%
Пояснение:
- WinGetTitle получает заголовок активного окна и сохраняет его в переменной ActiveWindowTitle.
- WinGetPos возвращает позицию и размеры; мы читаем только Width и Height, пропуская ненужные значения.

Размеры экрана
AutoHotKey предоставляет встроенные переменные A_ScreenWidth и A_ScreenHeight — они уже содержат размеры видимой области основного монитора и готовы к использованию.
Вычисляем целевые координаты для центрирования
Числовые вычисления мы записываем в переменные TargetX и TargetY:
TargetX := (A_ScreenWidth/2)-(Width/2) ; горизонтальная цель
TargetY := (A_ScreenHeight/2)-(Height/2) ; вертикальная цель
Логика простая: половина ширины экрана минус половина ширины окна даёт координату левого края окна, при которой окно окажется по центру.

Перемещаем окно
Команда WinMove перемещает окно по рассчитанным координатам:
WinMove, %ActiveWindowTitle%,, %TargetX%, %TargetY%
- Первый параметр — заголовок окна (мы передаём переменную с процентами).
- Второй параметр (оставлен пустым) — текст, позволяющий уточнить окно, но для наших целей не нужен.
- Третий и четвёртый — X и Y координаты.
Готовый базовый скрипт
Ниже — полный и проверенный минимальный скрипт, который вы можете сохранить в .ahk и запустить:
#NoEnv ; Рекомендуется для производительности и совместимости с будущими релизами AutoHotkey.
; #Warn ; Включите при отладке для обнаружения частых ошибок.
SendMode Input ; Быстрый и надёжный режим отправки ввода.
SetWorkingDir %A_ScriptDir% ; Рабочая директория — папка скрипта.
^y::
WinGetTitle, ActiveWindowTitle, A ; Получаем заголовок активного окна.
WinGetPos,,, Width, Height, %ActiveWindowTitle% ; Получаем ширину/высоту активного окна.
TargetX := (A_ScreenWidth/2)-(Width/2) ; Горизонтальная координата для центрирования.
TargetY := (A_ScreenHeight/2)-(Height/2) ; Вертикальная координата для центрирования.
WinMove, %ActiveWindowTitle%,, %TargetX%, %TargetY% ; Перемещаем окно.
return
После сохранения двойной клик по файлу запустит скрипт (AutoHotKey должен быть установлен). Нажмите Ctrl+Y — активное окно переместится по центру основного монитора.
Расширение для двух и более мониторов (простой переключатель)
Ниже — более длинный, но понятный вариант, который при повторном нажатии чередует центрирование между основным монитором и вторым монитором. Подходит в простых конфигурациях с относительным расположением мониторов.
#NoEnv
; #Warn
SendMode Input
SetWorkingDir %A_ScriptDir%
PositionToggle = 1 ; Переключатель: 1 — основной монитор, 2 — второй.
^y::
WinGetTitle, ActiveWindowTitle, A
WinGetPos,,, Width, Height, %ActiveWindowTitle%
If PositionToggle = 1
{
TargetX := (A_ScreenWidth/2)-(Width/2)
TargetY := (A_ScreenHeight/2)-(Height/2)
PositionToggle = 2
}
Else If PositionToggle = 2
{
SysGet, Mon2, Monitor, 2 ; Получаем параметры второго монитора.
Mon2Width := Mon2Right - Mon2Left
Mon2Height := Mon2Bottom - Mon2Top
; Вычисляем позицию на втором мониторе. Учтите смещение относительно основного монитора.
TargetX := (Mon2Width/2)-(Width/2)+A_ScreenWidth
TargetY := (Mon2Height/2)-(Height/2)+Mon2Top
PositionToggle = 1
}
WinMove, %ActiveWindowTitle%,, %TargetX%, %TargetY%
return
Примечания:
- SysGet позволяет запросить параметры мониторов. Возвращаемые значения нужно использовать аккуратно, учитывая расположение второго монитора (слева или справа от основного, смещение по вертикали и т.д.).
- Для сложных конфигураций (несколько мониторов с произвольным расположением) эту логику стоит усложнить: определять, на каком мониторе сейчас окно, и центрировать относительно его границ.
Когда это не сработает — типичные ограничения
- Полноэкранные приложения и игры: их окна часто труднее или нельзя перемещать без нарушения состояния.
- Окна без заголовка или с динамическими заголовками: использование заголовка как ключа может быть ненадёжным, в таких случаях можно использовать HWND (идентификатор окна).
- Дескрипторы окон, у которых нет видимой области (например, всплывающие нативные элементы) — такие элементы иногда игнорируют WinMove.
- Права и UAC: окна, запущенные от администратора, могут игнорировать попытки изменения позиции из процесса с обычными правами.
Как сделать надёжнее (альтернативные подходы)
- Использовать HWND вместо заголовка: это точнее для окон без статичного заголовка. Пример получения HWND и использования:
WinGet, hwnd, ID, A
WinGetPos, , , Width, Height, ahk_id %hwnd%
WinMove, ahk_id %hwnd%, , %TargetX%, %TargetY%- Использовать сторонние утилиты: Microsoft PowerToys (FancyZones) предоставляет визуальные шаблоны разметки экрана.
- Делать исключения по классам окон или заголовкам: если окно содержит определённый текст в заголовке, пропускайте его.
- Запускать скрипт с повышенными правами, если цель — управлять окнами, запущенными от администратора.
Трюки и советы по кастомизации
- Измените комбинацию клавиш (строка ^y::) на удобную для вас.
- Добавьте проверку размеров окна: не пытайтесь центрировать окно, ширина которого превышает ширину экрана
if (Width > A_ScreenWidth)
{
; Не перемещаем и/или масштабируем
return
}- Автоматическое центрирование при открытии окна: можно добавить наблюдатель, но это потребует дополнительной логики, чтобы не мешать полноэкранным приложениям.
Критерии приёмки
- По нажатию назначенной клавиши активное окно должно перемещаться в центр видимой области основного монитора.
- Скрипт не должен ломать полноэкранные приложения (не вызывать их сворачивания).
- Поведение для второй мониторы (если используется расширенный скрипт) — повторное нажатие должно переключать монитор и корректно центрировать окно.
Проверочные сценарии (Test cases)
- TC1: Обычное приложение с заголовком (Блокнот). Ожидается: при нажатии горячей клавиши окно перемещается в центр.
- TC2: Приложение без обычного заголовка (графическая утилита). Ожидается: либо корректное центрирование, либо предсказуемый отказ (логическая обработка ошибки).
- TC3: Полноэкранная игра. Ожидается: скрипт не мешает (не вызывает свёртывание и не пытается переместить).
- TC4: Приложение, запущенное от администратора, при запущенном скрипте от обычного пользователя. Ожидается: возможно отсутствие эффекта — документируйте это как известный лимит.
- TC5: Двойной монитор — второе нажатие переключает монитор и центрирует окно на втором дисплее.
Быстрая отладка (Troubleshooting)
- Скрипт не реагирует: убедитесь, что файл .ahk запущен (иконка в трее) и AutoHotKey установлен.
- Ничего не перемещается: откройте скрипт в режиме #Warn и временно раскомментируйте ; #Warn для поиска ошибок.
- Окно меняет размер/сворачивается: возможно, приложение реагирует на WinMove иначе. Попробуйте использовать WinRestore/WinActivate перед перемещением.
Мини-методология безопасности и удобства
- Делайте горячую клавишу редко используемой комбинацией, чтобы избежать конфликтов с приложениями.
- Не делайте автозапуск для скриптов, которые вмешиваются в поведение полноэкранных приложений.
- Храните резервную копию скрипта с комментариями перед внесением изменений.
Быстрые шаблоны и сниппеты
- Изменение горячей клавиши на Alt+Shift+C:
!+c::
; ваш код
return- Использование HWND вместо заголовка (более надёжно):
WinGet, hwnd, ID, A
WinGetPos,,, Width, Height, ahk_id %hwnd%
TargetX := (A_ScreenWidth/2)-(Width/2)
TargetY := (A_ScreenHeight/2)-(Height/2)
WinMove, ahk_id %hwnd%,, %TargetX%, %TargetY%Роль-ориентированные чек-листы
Для обычного пользователя:
- Установлен AutoHotKey
- Создан и запущен скрипт
- Проверено центрирование на простом окне (Блокнот)
Для администратора/поддержки:
- Учитывать приложения, запущенные от администратора
- Проверить совместимость с политиками безопасности
- Подготовить инструкцию по откату/отключению скрипта
Для продвинутого пользователя:
- Заменить использование заголовков на HWND
- Расширить логику для произвольных мониторов
- Интегрировать с другими хоткеями/скриптами
Частые ошибки и их решения
- Проблема: окно не центрируется, но скрипт работает — возможно, окно — дочернее или без заголовка. Решение: используйте WinGet, ID, A и ahk_id.
- Проблема: некорректное центрирование на втором мониторе. Решение: проверьте значения Mon2Left/Mon2Top/Mon2Right/Mon2Bottom через MsgBox для отладки.
Полезные подсказки и альтернативы
- FancyZones из PowerToys даёт визуальное управление зонами и поддерживает множественные макеты.
- Сторонние программы-менеджеры окон (DisplayFusion, AquaSnap) предлагают расширенные возможности, но требуют установки ПО от третьих сторон.
Краткое резюме
- AutoHotKey позволяет быстро создать надёжный хоткей для центрирования активного окна.
- Базовый скрипт прост и безопасен: он действует только по запросу, не мешая полноэкранным приложениям.
- Для сложных конфигураций с несколькими мониторами лучше использовать получение HWND и явное вычисление границ нужного монитора.

Если вам нужно, я могу подготовить:
- Версию скрипта, которая автоматически определяет, на каком мониторе находится активное окно, и центрирует относительно него.
- Вариант с GUI для выбора мониторной зоны (визуальный выбор шаблона).
FAQ
Q: Можно ли центрировать окна без установки AutoHotKey? A: Да — некоторые менеджеры окон и PowerToys позволяют размещать окна по шаблонам, но AutoHotKey даёт максимальную гибкость и автоматизацию с минимальными ресурсами.
Q: Как сделать, чтобы скрипт центрировал окно автоматически при его создании? A: Это потребует фонового слежения за созданием окон и дополнительной логики, чтобы не мешать полноэкранным приложениям.
Q: Можно ли центрировать на конкретном мониторе, а не по переключателю? A: Да — используйте SysGet для получения границ нужного монитора и вычисляйте TargetX/TargetY относительно этих границ.
Конец руководства — теперь у вас есть всё необходимое, чтобы быстро центрировать окна с помощью AutoHotKey. Пользуйтесь сочетанием клавиш и экономьте время при работе с окнами!
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента