Предыстория: Linux, привычки и боль
Долгое время моим основным рабочим окружением был Linux. Там, как известно, «из коробки» (или через легкий тюнинг конфигов) можно повесить смену раскладки на любую клавишу. Я привык использовать для этого CapsLock. Это эргономично: мизинец лежит рядом, не нужно выкручивать пальцы в аккорды типа Alt+Shift или тянуться к Win+Space.
Но обстоятельства сложились так, что мне пришлось переехать на Windows. И тут начались фантомные боли. Стандартными средствами повесить смену языка на CapsLock — задача нетривиальная, а сторонний софт часто перегружен лишним функционалом.
Спасение в 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
Я переписал логику. Вместо слепого переключения "вперед", программа теперь точно знает, на какой язык переключаться.
При старте программа считывает ID раскладок (HKL) из
iniфайла или авто-детектит первые две из системного списка.При нажатии CapsLock определяем текущую раскладку активного окна.
Если текущая
Layout1— включаемLayout2. В любом другом случае (даже если включен 3-й или 4-й язык) — принудительно возвращаемLayout1.
Вместо эмуляции клавиатуры используется прямая отправка сообщения окну:
PostMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, 0, (LPARAM)targetLayout);
Это работает надежнее и быстрее, чем эмуляция нажатия клавиш, и позволяет жестко зафиксировать пару языков для быстрого переключения.
Фичи и конфиг
Проект обзавелся файлом конфигурации switchy.ini, который должен лежать рядом с .exe.
Возможности:
Жесткое задание языков: Можно указать HEX-коды раскладок (например,
00000409для US). Если оставить пустым — подхватит первые две из системы.Свой хоткей: Если вы сектант правого Ctrl или другой клавиши, код клавиши можно поменять в конфиге (по умолчанию
20— это CapsLock).Оригинальный CapsLock: Доступен по
Shift + Hotkey.Вкл/Выкл: Утилиту можно временно отключить нажатием
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)

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

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

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

ImagineTables
18.12.2025 23:05Раскладка специально для символов, хм…
Я впилил самые нужные мне спецсимволы в En/Ru, но каждое второе приложение (виндовый Notepad, Телега и другие) считает себя умнее меня и резервирует мои
Ctrl+Пробел,Ctrl+ цифры и т.д. для собственных нужд без возможности отключения. Может, в натуре, сделать раскладку для символов? Только придётся отвыкать от того, что одно и то же сочетание для русского языка вводило«, а для английского“(что очень удобно).Вопрос: а у вас можно повесить на
Ctrl+Shiftпереключение по кругу между Ru/En, а наCapsLock— переключение между символьной раскладкой и предыдущей? И так, из любопытства: у вас черезWH_KEYBOARD_LLсделано?P.S. Мечтаю, чтобы кто-нибудь запилил альтернативу виндовому
Win+V. Идея хорошая, но реализация настолько отстойная, насколько может быть программа, написанная кривыми микрософтовскими ногами. Ни окно сделать побольше, ни категорию назначить любимой, ни свои символы добавить, ни сделать полную библиотеку символов, ни размер текста увеличить, ни хоткеи назначить после открытия окна, ни… короче, перечислять можно долго.
AlexDemi
18.12.2025 23:05Win+V - это который clipboard history? В Power Toys есть Advanced версия...

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

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

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

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

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

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

ts347
18.12.2025 23:05Существует гениальное решение для переключения языка по CapsLock — единая раскладка, в которой при выключенном Capslock вводятся английские буквы, а при включенном — русские.
Что в результате. Переключение мгновенное. Отпадает необходимость в сторонних фоновых процессах, которые могут не работать в режиме администратора. Индикатор на клавиатуре всегда правильно показывает язык (просто потому что это зашито в самой раскладке).
Да, я понимаю, что статья не совсем про это.

falcon4fun
18.12.2025 23:05Проблемы белых людей какие то. Что мешает объединять вводы одного языка в группу, например редкоиспользуемые запихнуть чтобы переключались по ctrl shift, глобальную смену на alt+shift?
Я в целом промолчу что 3 языка нужно редко. Я, например, ради специфичных букв не ставил государственный язык (добавляет список букв с модификатором shift+цифры). Просто не пользуюсь ими.
Когда ставил, юзал первый вариант: английский и третий язык переключался по ctrl+shift, эта группа и русский - alt shift. Никогда в жизни даже индикатором раскладки в трее не пользовался. Что я делаю не так? :D

temnikov_vasiliy
18.12.2025 23:05Все уже написано до вас - https://github.com/valodzka/lswitch
я переписал её для себя так : левый шифт - английская раскладка, правый шифт - русская.
теперь не думаю/смотрю в трей какая текущая. нужно печать на инглиш - жму левый шифт и печатаю, на русском - правый шифт - и печатаю дальше. и никаких аккордов... ;)
стоит ли её выкладывать на гитхаб ?..

Levithan
18.12.2025 23:05Как будто проще взять клавиатуру с софтом, создать макрос и сохранить в память клавиатуры, собственно всё, софт больше не нужен.
Я так и сделал, удобно.
MountainGoat
Хм. Беру AutoHotKey и не нужно под каждую клавишу отдельноле приложение писать.
WoozyMasta Автор
Здорово, вы большой молодец!
Можно и на Electron написать, но как и в случае с AHK нужно будет написать код, исполнение только будет на разных уровнях.