Перейти к содержанию

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

MacBook_Keyboard_RUS

Боль, страдания и три часа жизни

Представь: у тебя 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:

  1. Нажми Win + R, введи shell:startup, нажми Enter
  2. Перетащи ярлык файла fix_keyboard.ahk в открывшуюся папку

  3. Всё. При каждой загрузке 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, и наоборот. Каждый раз с первого нажатия.