Предыстория: Linux, привычки и боль

Долгое время моим основным рабочим окружением был Linux. Там, как известно, «из коробки» (или через легкий тюнинг конфигов) можно повесить смену раскладки на любую клавишу. Я привык использовать для этого CapsLock. Это эргономично: мизинец лежит рядом, не нужно выкручивать пальцы в аккорды типа Alt+Shift или тянуться к Win+Space.

Но обстоятельства сложились так, что мне пришлось переехать на Windows. И тут начались фантомные боли. Стандартными средствами повесить смену языка на CapsLock — задача нетривиальная, а сторонний софт часто перегружен лишним функционалом.

Спасение в Switchy

Switchy
Switchy

В поисках решения я наткнулся на замечательный проект Switchy от пользователя erryox.

Хочу выразить огромную благодарность автору. Утилита делала ровно то, что нужно: вешала смену раскладки на CapsLock, оставляя оригинальный функционал (включение лампочки капса) на Shift+CapsLock. Проект написан на чистом C, без лишних зависимостей, весит копейки и работает через низкоуровневый хук клавиатуры.

Однако, сейчас оригинальный репозиторий находится в архиве, а в процессе использования я столкнулся с кейсом, который оригинальная утилита не покрывала.

Проблема «карусели» из раскладок

Оригинальный Switchy (и многие аналоги) работают по принципу эмуляции нажатия системных хоткеев (например, посылают системе Alt+Shift или Win+Space).

Это отлично работает, если у вас две раскладки (EN/RU).
Но что делать, если вы программист, лингвист или просто живете в мультикультурной среде? У меня, например, установлено 5 раскладкок (EN, RU, плюс два специфичных языка и символьная типографская раскладка).

При нажатии на CapsLock оригинальная утилита просто переключает на "следующую". Получается карусель:
EN -> RU -> L3 -> L4 -> Символы -> EN...

В 99% времени мне нужно переключаться только между EN и RU. А прокручивать каждый раз весь список, чтобы написать коммент в коде, дико раздражает.

Решение: Switchy Fork

Так появился мой форк. Идея проста: CapsLock должен переключать только между двумя основными языками, игнорируя остальные. А если мне вдруг понадобится немецкий или японский — я выберу его мышкой или стандартным Win+Space.

Как это работает под капотом

В оригинале использовалась эмуляция нажатия:

// Оригинальный подход (упрощенно)
keybd_event(VK_MENU, 0, 0, 0); // Alt
keybd_event(VK_LSHIFT, 0, 0, 0); // Shift
// ...release keys

Я переписал логику. Вместо слепого переключения "вперед", программа теперь точно знает, на какой язык переключаться.

  1. При старте программа считывает ID раскладок (HKL) из ini файла или авто-детектит первые две из системного списка.

  2. При нажатии CapsLock определяем текущую раскладку активного окна.

  3. Если текущая Layout1 — включаем Layout2. В любом другом случае (даже если включен 3-й или 4-й язык) — принудительно возвращаем Layout1.

Вместо эмуляции клавиатуры используется прямая отправка сообщения окну:

PostMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, 0, (LPARAM)targetLayout);

Это работает надежнее и быстрее, чем эмуляция нажатия клавиш, и позволяет жестко зафиксировать пару языков для быстрого переключения.

Фичи и конфиг

Проект обзавелся файлом конфигурации switchy.ini, который должен лежать рядом с .exe.

Возможности:

  1. Жесткое задание языков: Можно указать HEX-коды раскладок (например, 00000409 для US). Если оставить пустым — подхватит первые две из системы.

  2. Свой хоткей: Если вы сектант правого Ctrl или другой клавиши, код клавиши можно поменять в конфиге (по умолчанию 20 — это CapsLock).

  3. Оригинальный CapsLock: Доступен по Shift + Hotkey.

  4. Вкл/Выкл: Утилиту можно временно отключить нажатием Alt + Hotkey.

Пример switchy.ini:

[Settings]
; HKL раскладок можно найти в реестре или гугле
; 00000409 = English (US)
; 00000419 = Russian
; 00000422 = Ukrainian
; 00000407 = German
; 0000040C = French
; Оставьте пустым для автоопределения (1-я и 2-я раскладки в системе)
Layout1=00000409
Layout2=00000419

; Коды клавиши
; 20 = Caps Lock (По умолчанию)
; 19 = Pause/Break
; 45 = Insert
; 112 = F1
SwitchKey=20

Где взять

Исходный код и релиз доступны на GitHub — Switchy

Надеюсь, кому-то это сбережет нервы так же, как и мне. Пользуйтесь на здоровье!

Комментарии (19)


  1. MountainGoat
    18.12.2025 23:05

    Хм. Беру AutoHotKey и не нужно под каждую клавишу отдельноле приложение писать.


    1. WoozyMasta Автор
      18.12.2025 23:05

      Здорово, вы большой молодец!
      Можно и на Electron написать, но как и в случае с AHK нужно будет написать код, исполнение только будет на разных уровнях.


  1. anonymous
    18.12.2025 23:05


  1. NOnameSERVER
    18.12.2025 23:05

    А как ведёт себя с приложениями, которые любят перехватывать ввод? VS, RDP, старые IDE?


  1. foreva
    18.12.2025 23:05

    Посмотрите на https://github.com/Aegel5/SimpleSwitcher — она как раз должна закрывать ваш случай с циклическим/выборочным переключением.


    1. vla3d
      18.12.2025 23:05

      Неплохая программа, но, кажется, ещё сыровата. У меня вдруг начала кроме раскладки выделенного текста ещё и его регистр менять


  1. ImagineTables
    18.12.2025 23:05

    Раскладка специально для символов, хм…

    Я впилил самые нужные мне спецсимволы в En/Ru, но каждое второе приложение (виндовый Notepad, Телега и другие) считает себя умнее меня и резервирует мои Ctrl + Пробел, Ctrl + цифры и т.д. для собственных нужд без возможности отключения. Может, в натуре, сделать раскладку для символов? Только придётся отвыкать от того, что одно и то же сочетание для русского языка вводило «, а для английского (что очень удобно).

    Вопрос: а у вас можно повесить на Ctrl + Shift переключение по кругу между Ru/En, а на CapsLock — переключение между символьной раскладкой и предыдущей? И так, из любопытства: у вас через WH_KEYBOARD_LL сделано?

    P.S. Мечтаю, чтобы кто-нибудь запилил альтернативу виндовому Win + V. Идея хорошая, но реализация настолько отстойная, насколько может быть программа, написанная кривыми микрософтовскими ногами. Ни окно сделать побольше, ни категорию назначить любимой, ни свои символы добавить, ни сделать полную библиотеку символов, ни размер текста увеличить, ни хоткеи назначить после открытия окна, ни… короче, перечислять можно долго.


    1. AlexDemi
      18.12.2025 23:05

      Win+V - это который clipboard history? В Power Toys есть Advanced версия...


      1. ImagineTables
        18.12.2025 23:05

        Как раз clipboard history я бы отключил, но лень разбираться, где. Для меня это быстрый ввод спецсимволов.


  1. PopovPS
    18.12.2025 23:05

    А я вот не люблю когда у меня "лишние" процессы висят в памяти. Поэтому для таких кейсов у меня QMK клавиатура)


    1. SuperFly
      18.12.2025 23:05

      О, а как у вас это в QMK сделано? Хотя б в общих чертах


      1. PopovPS
        18.12.2025 23:05

        ну как бы, при помощи макросов и лома можно сделать больше чем при помощи просто лома.. Для простых случаев хватит макросов (у меня сейчас просто висит нажатие ctrl+shift на capslock). Если нужно более сложное поведение в принципе можно самому пересобрать прошивку добавив нужные функции


  1. Iscander_Che
    18.12.2025 23:05

    Я правильно понимаю, что и оригинальная версия Swtchy, и ваш форк работают правильно только в том случае, когда исходно переключение языков настроено на левый Shift +Alt? По крайней мере, у меня утилита заработала только тогда, когда я перенастроил на это с Ctrl + Shift. Можно как-то улучшить, чтобы это отлавливать? Или код сильно усложнится?


  1. DmDu
    18.12.2025 23:05

    Спасибо, хороший человек! Недавно познал кайф однокнопочного переключения, на Маках. Но поскольку в основном работаю на Окнах то твоя статья прям очень в тему.


  1. anonymous
    18.12.2025 23:05


  1. ts347
    18.12.2025 23:05

    Существует гениальное решение для переключения языка по CapsLock — единая раскладка, в которой при выключенном Capslock вводятся английские буквы, а при включенном — русские.

    kbdasm

    Что в результате. Переключение мгновенное. Отпадает необходимость в сторонних фоновых процессах, которые могут не работать в режиме администратора. Индикатор на клавиатуре всегда правильно показывает язык (просто потому что это зашито в самой раскладке).

    Да, я понимаю, что статья не совсем про это.


  1. falcon4fun
    18.12.2025 23:05

    Проблемы белых людей какие то. Что мешает объединять вводы одного языка в группу, например редкоиспользуемые запихнуть чтобы переключались по ctrl shift, глобальную смену на alt+shift?

    Я в целом промолчу что 3 языка нужно редко. Я, например, ради специфичных букв не ставил государственный язык (добавляет список букв с модификатором shift+цифры). Просто не пользуюсь ими.

    Когда ставил, юзал первый вариант: английский и третий язык переключался по ctrl+shift, эта группа и русский - alt shift. Никогда в жизни даже индикатором раскладки в трее не пользовался. Что я делаю не так? :D


  1. temnikov_vasiliy
    18.12.2025 23:05

    Все уже написано до вас - https://github.com/valodzka/lswitch

    я переписал её для себя так : левый шифт - английская раскладка, правый шифт - русская.

    теперь не думаю/смотрю в трей какая текущая. нужно печать на инглиш - жму левый шифт и печатаю, на русском - правый шифт - и печатаю дальше. и никаких аккордов... ;)

    стоит ли её выкладывать на гитхаб ?..


  1. Levithan
    18.12.2025 23:05

    Как будто проще взять клавиатуру с софтом, создать макрос и сохранить в память клавиатуры, собственно всё, софт больше не нужен.

    Я так и сделал, удобно.