Обновить

Комментарии 61

Идут годы, а переключение раскладки всё тормозит со времён windows xp по-моему.

Идут годы, и статьи про работу в Win11 образца 2026 начинают напоминать статьи по работу в линухах-бздях года так 2006го. про себя помню, что где-то примерно в 2005м я начал пользовать линукс для домашнего бытия, и одно время уж не помню с чего в нем у меня были какие-то траблы именно с переключением раскладок, делал это мышкой, и подбешивало. но недолго. А в винде я за все время (с 1997го) никаких таких проблем не встречал, уж не знаю, почему. А перебрал я 3.11, 95, 98, Me, 2k, 2k3, Xp, Vista, 7, 8,10 в разных версиях. Чудны дела твои, Господи...

Я встречал проблемы с переключением в XP/VISTA/8/10/11

Раскладка реально периодически не меняется и всегда в рандомные моменты.

Я так понимаю версии где-то с 8, они сделали обработку клавиатуры асинхронной, из-за чего полезли все косяки. Самый бесячий - когда переключаешь раскладку и сразу начинаешь печатать, то первые несколько букв остаются ещё в старой раскладке.

2k3 это разве не серверная?

Она самая. Но как десктопная тоже вполне работала.

Мне кажется оно железо-зависимо. Исключительно на одном ноуте встречал стабильную проблему с переключением языка, но там в целом был отдельный драйвер для функциональных клавиш и alt ctrl и прочего (зачем - вопросы к hp). На десятках других машин ни разу не ловил проблем с переключением.

Но для разработки автопереключение часто неудобно

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

Так если оно неудобно - оно отключается. Можно глобально, можно на уровне приложений. И пунту использоваться как инструмент для переключения раскладок, ручного исправления неправильно набранного текста и "дневника". Пусть последнее и не секьюрно, но полезно бывает.

Впрочем, я пунтой тоже уже не пользуюсь, но по другим причинам.

Впрочем, я пунтой тоже уже не пользуюсь, но по другим причинам

Ну вот да, ставить добровольно себе в систему кейлоггер от яндекса, я лучше сам раскладку переключу 🤷

Блокируем в файрволле его и всё. То немногое, что продолжает работать спокойно.

Пунта тоже норм, но я там не нашел возможности настроить переключение на Alt+Shift

Так она системный переключатель не обязательно заменяет, может параллельно работать.

Но пока я ей пользовался, я переключение на правый Ctrl вешал. Сейчас у меня оно висит на правой макро (А), но всё равно Сtrl+Shift пользуюсь.

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

Я всё равно не владею десятипальцевым методом, так что руки у меня, как правило, не на буквах лежат. И чуть-чуть сдвинуть правую руку мне обычно несложно, проще, чем пальцы ради Ctrl+Shift гнуть.

Переключаю с помощью Ctrl+Shift, мне так удобнее, они рядом и можно одним пальцем нажать. И не сбоит, первый раз слышу, что проблема.

Сам юзаю эту комбинацию и иногда бывает, что после быстрого нажатия не переключается. Правда не знал, что это какая-то глобальная проблема. Юзаю Windows 11 Pro последней стабильной версии.

Это рандомно. Скачет от обновы к обнове. И alt+tab так же. И именно win11. На соседней win 10. Всё ок.

И на 10ке проблема была

Сбоит, временами несколько раз ткнуть надо. Наблюдаю много лет, причём зависимости явной не вижу. Сейчас чаще в 11 наблюдаю, хотя и в 10 есть.

Пробовал, быстро и медленно. Не сбоит. Клавиатура HyperX полноразмерная. Позже попробую другие протестировать. Дома несколько штук.

От клавиатуры не зависит. И, как уже сказал, зависимости не наблюдаю. Иногда работает моментально, иногда несколько раз тыкать приходится.

При Гейтсе такого не было!) Периодически этот глюк замечаю, на разных ПК, ужасно бесит. И ЕМНИП это в 11 началось. Тоже использую Ctrl+Shift - более удобное и логичное сочетание. Для серверов оставляю неправославный - через Alt, чтобы путаницы при переключении языка не было, когда подключаешься.

Переключаю с помощью Ctrl+Shift, мне так удобнее, они рядом и можно одним пальцем нажать.

Ещё удобнее включать один язык по Ctrl-Shift, а второй - по Alt-Shift.

У меня немощный мизинец...

Есть такая проблема, раньше стояло переключение Ctrl+Shift, думал в этом дело, переставил на Alt+Shift - разницы не заметил, приходится пока привыкать к Win+Пробел. Попробую ещё Ваш вариант.

У кого нет проблемы люди просто мало печатают и редко переключают . Или скорость их устраивает. Проблема есть и она задолбала.

Этот скрипт не работает в некоторых программах. Тут например mstsc.exe

Гпт сделал бинарник на расте заточенный конкретно под эту задачу, но запускать его приходится от имени админа иначе такая же проблема. Говорит что как вариант можно подписать бинарник. Или рут или подпись или не везде работать будет.

Если запускать скрипт через AutoHotkey64_UIA.exe, то он будет работать везде, в том числе и в программах, запущенных с правами администратора через UAC. Только надо, чтобы Autohotkey был установлен в Program Files. Это в Help написано https://www.autohotkey.com/docs/v2/Program.htm#Installer_uiAccess

Через AutoHotkey64_UIA.exe то же самое. В "старых" программах не работает.

Layout Fix работает?

Оказалось, работает.

blbnt yf [eq cj cdjbvb ghbdtn rfr ltkf

С 2003 года ей пользуюсь. Ехе-шник на 157кб)

Повесил переключение на кнопку CapsLock (как ламер через Пунто) и все.

Вообще до сих пор удивлен, что Майкрософт со своей поддержкой винды по всему миру не додумалась одну-две кнопки раскладки на клавиатуру пропихнуть, по аналогии с Win и Copilot.

На советских компах была отдельная кнопка Rus/Lat, некоторые отечественные производители делают клаву с такой кнопкой вместо Win кнопки.

Значит это у всех так, я думал это у меня с головой не в порядке 😂 благодарю за статью

Никогда в Windows (от Win98 до Win11) не замечал задержки при переключении языка (Alt+Shift). Печатаю много и быстро (разработка). Но когда пересел на MacOS сразу всплыла эта проблема! Очень раздражает, хотя макбук не слабенький вроде - MacBook M3 Pro. Всё перепробовал, лучше ситуация не стала, приходится терпеть и при переключениях ждать.

Еще можно на винду вернуться. Никто не запрещает

Спасибо за статью, я уже думал что у меня клавиатура не исправна. Но стоит добавить что autohotkey воспринимается некоторыми античит программами как запрещенное ПО. У меня с ним например не запускается Battlefield 6

Я тоже думал, что шиза уже. Недавно вообще начало два раза переключать (на новую и обратно), помогал только перезапуск.

Но да, ахк не лучший вариант, если много играете, финалс и бф заблочит вход. Подписание, изменение класса у окон не помогает. Пришлось все скрипты переписывать на c#

Проблеме лет 10, каждый раз когда мне говорят что windows уже нормально работает вспоминаю её и "панель задач уже присутствует на данном экране".

Говорят в превью билде сейчас тестируют новую реализацию пуска и большую переработку explorer, в которой отошли от xaml и таких проблем уже нет. Верится с трудом но может наконец избавимся от этой проблемы.

Эта проблема связана с пользователем, а не с Виндой. Суть проблемы в том, что Alt отпускается раньше, чем нажимается Ctrl. Это ведь сочетание клавиш и Alt - модификатор. Я это много раз замечал за собой. И стараюсь заставлять себя дольше держать Alt зажатым.

Как начал пользоваться маком, под видой тоже настроил использование CAPS для переключения языков. Это реально удобно.

Я использую свой конфиг для kanata (крохотная утилита) - CAPS между двумя основными языками и стандартное переключение на третий, который используется редко.

Перешёл на прямой выбор языка через Ctrl+Shift+Цифра, т.к. активно пользуюсь тремя раскладками. Работает стабильно, легко сразу прыгнуть на нужный язык.

Эту беду замечаю с вин7. Сначала думал что не одномоментно нажимаю комбинацию, перевел все на тильду, но это просто раскрыло суть: приоритет прерывания по переключению раскладки очень низкий, из-за этого в одних приложениях это часто проявляется, в других нет. Иногда доходит до глупости, нажал, печатаешь не то, нажал снова не то, на третий раз уже медленно, отслеживая глазами, что оно графически переключилось - тогда работает. На самом деле приоритет прерывания повысить и все заработает, но это должны сделать майки.

А почему не использовать вин + пробел? Оно штатное, работает адекватно, да и в целом убобно что на пол экрана плашка с тем какой язык выбран.

Единственная причина как по мне это если как у коментатора выше более 2х языков и хочется выбрать конкретный а не методом перебора

Ответ простой - привычка)

У меня тоже 3 языка. В настройках клавиатуры windows 11 назначил ctrl +1 англ. Ctrl +2 русский. Ctrl+3 иврит.

скрипт из поста, без правок - вылетает в дебаг при вызове

Всё работает, но автору следовало бы расписать всё более подробно в т.ч. запуск для программ от имени администратора и с вариантом Ctrl + Shift, а не делать ссылку на бошьшую доку. В общем статья полугодная получилась, хотя и на этом спасибо. GPT помог допилить.

Данный код не учитывает проблемы с задержкой, из-за которой вводимые символы не соответствуют раскладке клавиатуры какое-то время после переключения. Исправил тут: https://www.autohotkey.com/boards/viewtopic.php?f=83&t=140529&p=617670#p617670

; WM_INPUTLANGCHANGEREQUEST
SetKeyboardLayout(id) => PostMessage(0x50, 0, id, , 'A')
_SetKeyboardLayout(id) => SendMessage(0x50, 0, id, , 'A')

GetKeyboardLayout() => DllCall(
    'GetKeyboardLayout', 'Ptr', 
        DllCall(
            'GetWindowThreadProcessId', 
            'Ptr', DllCall('GetForegroundWindow'), 
            'UInt', 0
        )
    )

SwitchKeyboardLayout() {    
    static toggle  := 0x04190419 == GetKeyboardLayout()
    static layouts := Map(
        0, 0x04190419,  ; RU
        1, 0x04090409   ; EN
    )    
    
    _SetKeyboardLayout(layouts[toggle])
    
    while (layouts[toggle] != GetKeyboardLayout())
        Sleep(100)
    
    toggle ^= 1    
    return toggle
}

; SendLevel = 3: intercept all keys including AHK-generated;
; Timeout = 2 sec.: stop after 2 seconds (unless .Stop() has been called during that period) 
InputKeysHook := InputHook('I3 T2')
!f::{
    InputKeysHook.Start()
    SwitchKeyboardLayout()            

    loop parse, InputKeysHook.Input {
        SendEvent('{vk' GetKeyVK(A_LoopField) '}')
    }  
    InputKeysHook.Stop()
}

Для тех, кто нашёл эту статью через Google — есть более элегантное решение: переключение раскладки через Caps Lock (github.com/WoozyMasta/Switchy). Это и удобнее, чем Alt+Shift, и устраняет этот баг.

UPD: сделал форк (спасибо Claude) для переключения языка по Caps Lock (при нажатии) и включения Caps Lock по Shift+Caps Lock (тоже при нажатии). Это удобнее и убирает возможные проблемы со слепой печатью (например, когда машинально быстрее нажимаешь на букву чем отпускаешь caps lock. Столкнулся с этим лично — отсюда и форк)

UPD2: сделал свою программу (так же через AI), там меньше кода и она чуть меньше весит/потребляет по сравнению с Switchy: https://github.com/oifj34f34f/caps_switcher

Спасибо огромное автору! У меня вообще по жесткачу было. Я просто комп не выключаю вообще месяцами. Я подумал клава плохая, купил дорогую, проблема не ушла))). Думаю ну может я нажимаю быстро слишком и тупит. Реестр правил не помогло, Иногда по 10 раз нажимал пытался переключить. Сколько ты нервов сберег людям!)

Нашел косяк. Keil Uvision 5.36.0.0
в приложении смена языка работает, но если жмем CTL+F открываем окно поиска, и там не работает переключение языка через клаву вообще теперь. Только мышкой в трее.

Блин еще один косяк. Когда жму Save as где нибудь в каком нибудь приложении и нужно ввести название файла тоже не меняется раскладка с этим скриптом.

Исправил косяк. Не я а Клод.

Что не работало и почему:

PostMessage (WM_INPUTLANGCHANGEREQUEST) не работает для системных/привилегированных окон — диалоги открытия файлов, Win+R, окна поиска. Окно получает сообщение но игнорирует его.

Два исправления:

1. ControlGetFocus — вместо отправки сообщения на окно-контейнер, берём hwnd конкретного сфокусированного контрола (поля ввода) внутри окна. Для многих диалогов это уже помогает.

2. ActivateKeyboardLayout — системный вызов WinAPI, который переключает раскладку напрямую на уровне системы, в обход PostMessage. Работает там где PostMessage игнорируется.

Важно: скрипт нужно запускать от имени администратора, иначе ActivateKeyboardLayout не сработает для привилегированных окон.

Вот целиком скрипт переписанный:

#Requires AutoHotkey v2.0 #SingleInstance Force

~*LAlt::TrySwitch() ~*RAlt::TrySwitch() ~*LShift::TrySwitch() ~*RShift::TrySwitch()

TrySwitch() { static lastTick := 0 if !(GetKeyState(“Alt”, “P”) && GetKeyState(“Shift”, “P”)) return now := A_TickCount if (now - lastTick < 150) return lastTick := now ToggleRuEn() }

ToggleRuEn() { static RU := 0x0419 static EN := 0x0409

hwnd := WinActive("A")
if !hwnd
    return

; Берём сфокусированный контрол внутри окна (например поле ввода в диалоге)
focusedHwnd := ControlGetFocus("A")
if focusedHwnd
    hwnd := focusedHwnd

threadId := DllCall("GetWindowThreadProcessId", "Ptr", hwnd, "UInt*", 0, "UInt")
hkl      := DllCall("GetKeyboardLayout", "UInt", threadId, "UPtr")
langId   := hkl & 0xFFFF
target   := (langId = RU) ? EN : RU
targetHKL := DllCall("LoadKeyboardLayout", "Str", Format("{:08X}", target), "UInt", 0, "UPtr")
if !targetHKL
    targetHKL := (target << 16) | target

; Для обычных окон
DllCall("PostMessage", "Ptr", hwnd, "UInt", 0x50, "Ptr", 0, "Ptr", targetHKL)

; Для системных/привилегированных окон (Win+R, диалоги открытия файлов и т.д.)
DllCall("ActivateKeyboardLayout", "UPtr", targetHKL, "UInt", 0)

}

Вот конкретно его исправления:

Конкретно добавил 3 вещи:

1. Получение сфокусированного контрола внутри окна:

autohotkey

focusedHwnd := ControlGetFocus("A")
if focusedHwnd
    hwnd := focusedHwnd

2. Загрузка настоящего HKL через системную функцию вместо ручного сдвига битов:

autohotkey

targetHKL := DllCall("LoadKeyboardLayout", "Str", Format("{:08X}", target), "UInt", 0, "UPtr")
if !targetHKL
    targetHKL := (target << 16) | target

3. Системный вызов переключения раскладки в дополнение к PostMessage:

autohotkey

DllCall("ActivateKeyboardLayout", "UPtr", targetHKL, "UInt", 0)

Самое главное из этих трёх — именно пункт 3, он решает проблему с Win+R и диалогами. Остальные два — улучшения надёжности.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации