Как починить русскую раскладку при работе с Mac по RDP на Windows¶

Боль, страдания и три часа жизни¶
Представь: у тебя MacBook Air с русской раскладкой Apple. Ты работаешь через Jump Desktop по RDP с Windows-машиной. Вроде всё настроено, всё летает — и тут начинается.
Ты хочешь поставить ё. Нажимаешь привычную клавишу рядом с Enter — и получаешь э. Ты хочешь напечатать ? — получаешь ,. Хочешь % — получаешь ;. Вся пунктуация — не там. Каждая третья клавиша врёт.
Ты гуглишь. Находишь совет: "поставь Russian Apple раскладку в Windows". Ставишь. Но тут оказывается, что у тебя стоит Punto Switcher — и он начинает вести себя неадекватно, потому что не знает эту раскладку.
Ты гуглишь дальше. Находишь MSKLC — Microsoft Keyboard Layout Creator. Скачиваешь, запускаешь, пытаешься разобраться. Час потрачен. Ничего не работает. Удаляешь.
Ты находишь PowerToys. Ставишь. 150 МБ оперативной памяти только ради того, чтобы переназначить одну клавишу. И оно должно висеть в трее вечно.
Ты злишься.
А ответ — простой скрипт AutoHotkey на 20 строк, который решает всё раз и навсегда.
Почему так происходит¶
Физически всё логично: твой Mac посылает в Windows скан-коды с реальной клавиатуры. Windows получает скан-код клавиши \ (рядом с Enter на Apple ISO) — и интерпретирует его по своей русской раскладке ЙЦУКЕН, где на этой клавише живёт э, а не ё.
Apple и Microsoft в своё время разошлись в раскладках и никогда не пытались совместиться. Ни одна из сторон не считает это своей проблемой. А RDP добавляет третий слой: скан-коды летят с Mac, интерпретируются Windows, и вся маковская логика рассыпается.
Решение: AutoHotkey¶
AutoHotkey — бесплатная утилита автоматизации для Windows. Один файл, 5-10 МБ RAM, никаких конфликтов с Punto Switcher или другими программами.
Шаг 1. Установить AutoHotkey¶
Скачать с autohotkey.com → установить версию v2.
Шаг 2. Создать скрипт¶
Создай файл fix_keyboard.ahk в любом удобном месте (например, Документы).
Открой его в Блокноте и вставь следующее:
; Проверяет активна ли русская раскладка
isRu() {
hwnd := WinGetID("A")
tid := DllCall("GetWindowThreadProcessId", "ptr", hwnd, "ptr", 0, "uint")
return Format("{:x}", DllCall("GetKeyboardLayout", "uint", tid) & 0xFFFF) = "419"
}
; Ё рядом с Enter (клавиша \)
$\:: isRu() ? Send("ё") : Send("\")
$+\:: isRu() ? Send("Ё") : Send("|")
; Клавиша у левого Shift (ISO key) — [ и ]
$SC056:: Send("[")
$+SC056:: Send("]")
; Клавиша у Escape — § и ±
$SC029:: Send("§")
$+SC029:: Send("±")
; Пунктуация в русской раскладке
$+4:: isRu() ? Send("%") : Send("$")
$+5:: isRu() ? Send(":") : Send("{%}")
$+6:: isRu() ? Send(",") : Send("{^}")
$+7:: isRu() ? Send(".") : Send("&")
$+8:: isRu() ? Send(";") : Send("*")
; Клавиша / рядом с правым Shift
$SC035:: isRu() ? Send("/") : Send("/")
$+SC035:: isRu() ? Send("?") : Send("?")
Сохрани файл.
Шаг 3. Запустить скрипт¶
Дважды кликни на файл fix_keyboard.ahk. В системном трее появится иконка H — скрипт работает.
Шаг 4. Добавить в автозагрузку¶
Чтобы скрипт запускался автоматически при старте Windows:
- Нажми
Win + R, введиshell:startup, нажми Enter -
Перетащи ярлык файла
fix_keyboard.ahkв открывшуюся папку -
Всё. При каждой загрузке Windows скрипт будет стартовать сам.
Что делает скрипт¶
| Клавиша на Mac | Без скрипта (Windows) | Со скриптом |
|---|---|---|
\ рядом с Enter |
э | ё |
Shift + \ |
Э | Ё |
| Shift + 4 | ; | % |
| Shift + 5 | % | : |
| Shift + 6 | : | , |
| Shift + 7 | ? | . |
| Shift + 8 | * | ; |
/ у правого Shift |
. | / |
Shift + / |
, | ? |
Скрипт умный: в английской раскладке все клавиши ведут себя как обычно. Замены срабатывают только когда активна русская раскладка (0x419).
Почему нет готового решения?¶
Это пересечение очень узкой аудитории: работаешь на Mac → подключаешься по RDP к Windows → хочешь маковскую пунктуацию. Каждый кто решил эту проблему — просто написал скрипт для себя и забыл. Публиковать не стал.
Теперь этот гайд существует. Надеюсь сэкономит тебе три часа жизни.
Переключение по CapsLock¶
Проблема в том что Alt+Shift — это просьба переключить, а Windows иногда игнорирует. Надо делать детерминировано — сам смотришь какая раскладка сейчас активна и явно переключаешь на конкретную:
CapsLock::
{
hwnd := WinGetID("A")
tid := DllCall("GetWindowThreadProcessId", "ptr", hwnd, "ptr", 0, "uint")
current := Format("{:x}", DllCall("GetKeyboardLayout", "uint", tid) & 0xFFFF)
if (current = "419")
PostMessage(0x50, 0, 0x4090409,, "A") ; RU → EN
else
PostMessage(0x50, 0, 0x4190419,, "A") ; EN → RU
}
Никакого Alt+Shift — просто видит что сейчас RU, переключает на EN, и наоборот. Каждый раз с первого нажатия.