Лишние раскладки в Win+Space — как убрать | NeuroSwitcher

Поддержка

В Win+Space появились языки, которых вы не добавляли

Это наша ошибка, и мы её исправили. Версии NeuroSwitcher до 0.7.1 при попытке исправить текст могли подгрузить в систему раскладку языка, которого у вас никогда не было — чаще всего иврит или немецкий. Такая раскладка появляется в переключателе Win+Space, но не попадает в список языков Windows, поэтому в «Параметрах» её и нечего удалить. Ниже — как убрать её за пару минут.

Что произошло Старая версия вызывала системную функцию, которая устанавливает раскладку без спроса. Мы считали, что переключаемся на существующую раскладку, — а Windows её молча создавала.
Почему «Параметры» не помогают Раскладка, добавленная таким способом, не привязана ни к одному языку из списка «Предпочитаемые языки». Удалять в «Параметрах» нечего: там её просто нет.
Что уже исправлено С версии 0.7.1 приложение не устанавливает раскладки вообще — только переключается на те, что вы добавили сами. С 0.7.2 оно умеет и убирать оставшееся, одной кнопкой.

Быстрый путь — начните отсюда

В большинстве случаев хватает этого, и никакие команды не нужны.

Начиная с версии 0.7.2 приложение такие остатки больше не использует. Язык считается доступным, только если Windows хранит его постоянно — раскладку, подгруженную старой версией в текущий сеанс, приложение теперь игнорирует. Даже если она ещё видна в Win+Space, на ваш текст она уже не влияет: лишний язык не предлагается в подсказках и не мешает исправлять раскладку. Шаги ниже убирают её из системы совсем, но исправления работают правильно и до этого.

  • Обновитесь до 0.7.2 или новее. Свежая версия — на главной странице. Установка поверх сохраняет все ваши настройки; текущую версию видно в Консоли внизу боковой панели.
  • Откройте Консоль → раздел «Языки». У языка, которого вы не добавляли, будет кнопка «Убрать раскладку». Нажмите её — раскладка исчезнет из Win+Space сразу, без перезагрузки.
  • Снимите галочку с этого языка в том же разделе и сохраните. Галочка означает «исправлять в этот язык» и настраивается отдельно от раскладки.

Если обновляться прямо сейчас не хочется: закройте NeuroSwitcher через значок в трее и перезагрузите компьютер. Раскладка, подгруженная старой версией, часто нигде не сохраняется и после перезагрузки исчезает сама — при условии, что старое приложение больше не запускается.

Почему так вышло

Чтобы исправить текст, набранный не в той раскладке, приложение должно переключить раскладку в активном окне. До 0.7.1 оно делало это через функцию Windows LoadKeyboardLayoutW. Название обманчиво: функция не «берёт» раскладку из установленных, а устанавливает её, если её не было.

Пока в системе есть все нужные языки, разницы не видно. Но стоило приложению ошибиться и решить, что перед ним иврит, оно просило раскладку иврита — и Windows её создавала. У человека, никогда не имевшего дела с ивритом, в переключателе появлялся иврит.

Такая раскладка живёт в стороне от списка «Предпочитаемые языки»: Win+Space её показывает, «Параметры → Время и язык → Язык и регион» — нет. Отсюда и тупик, в который упирались все, кто пробовал удалить её обычным способом.

В 0.7.1 мы убрали саму причину: приложение больше ничего не устанавливает и переключается только на раскладки, которые у вас уже есть. Языка нет в системе — значит, исправлять в него нечего, и это честно: набирать на нём вы всё равно не могли. В 0.7.2 добавили вторую половину — кнопку «Убрать раскладку», которая разбирает и то, что осталось от старых версий.

Если раскладка осталась: что именно у вас лежит

Раскладка может держаться в системе тремя разными способами, и убираются они по-разному. Сначала посмотрите, какой у вас случай. Откройте PowerShell (кнопка «Пуск» → наберите powershell → Enter) и вставьте обе команды сразу. Они только читают и ничего не меняют:

Get-ItemProperty 'HKCU:\Keyboard Layout\Preload'
Get-WinUserLanguageList | Select-Object LanguageTag, InputMethodTips

Коды раскладок, которые пригодятся при чтении вывода:

00000409английская (США)
00000419русская
00000422украинская
0000040Dиврит
00000407немецкая (Германия)

Случай А. Язык есть в списке языков Windows

Во второй команде среди LanguageTag видно he или de (de-DE).

Значит, язык действительно попал в список Windows — его убирает и кнопка «Убрать раскладку» в Консоли, и «Параметры → Язык и регион → „…“ напротив языка → Удалить». То же самое одной командой:

$list = Get-WinUserLanguageList
$list = $list | Where-Object { ($_.LanguageTag -split '-')[0] -notin @('he','de') }
Set-WinUserLanguageList $list -Force

Затем выйдите из системы и войдите снова.

Случай Б. Лишняя клавиатура подвешена к вашему языку

В списке языков только ваши (en-US, ru, …), но у кого-то из них в InputMethodTips стоит 0000040D или 00000407.

Это дополнительная клавиатура внутри языка — на главной странице «Параметров» она не показывается. Уберите её вручную: «Параметры → Язык и регион → „…“ напротив языка → Параметры языка → Клавиатуры». Или командой:

$list = Get-WinUserLanguageList
foreach ($l in $list) {
  @($l.InputMethodTips | Where-Object { $_ -match '(0000040D|00000407)$' }) |
    ForEach-Object { [void]$l.InputMethodTips.Remove($_) }
}
Set-WinUserLanguageList $list -Force

Затем выйдите из системы и войдите снова.

Случай В. Раскладка есть только в реестре

В списке языков ничего лишнего, но в первой команде среди значений 1, 2, 3… стоит 0000040d или 00000407. Это тот самый случай, из-за которого «Параметры» бессильны.

Сначала попробуйте без реестра. «Параметры → Язык и регион → Добавить язык» → добавьте иврит (галочки «языковой пакет», «распознавание речи», «рукописный ввод» можно снять) → и сразу удалите его же через «…» → «Удалить». Windows уносит раскладку вместе с языком. То же самое с немецким.

Если не помогло — правка реестра. Сначала резервная копия:

reg export "HKCU\Keyboard Layout" "$env:USERPROFILE\Desktop\keyboard-layout-backup.reg"

Затем чистка. Номера в Preload должны идти подряд начиная с единицы, поэтому оставшиеся раскладки перенумеровываются:

$key = 'HKCU:\Keyboard Layout\Preload'
$props = (Get-ItemProperty $key).PSObject.Properties |
         Where-Object { $_.Name -match '^\d+$' } | Sort-Object { [int]$_.Name }
$keep = @($props | ForEach-Object { $_.Value } | Where-Object { $_ -notin @('0000040d','00000407') })
$props | ForEach-Object { Remove-ItemProperty $key -Name $_.Name }
$i = 1; foreach ($v in $keep) { New-ItemProperty $key -Name "$i" -Value $v -PropertyType String | Out-Null; $i++ }
Get-ItemProperty $key

В выводе последней команды должны остаться только ваши раскладки. Выйдите из системы и войдите снова.

Если раскладка вернулась

Значит, её кто-то добавляет заново. Проверьте по порядку:

  • Старая версия NeuroSwitcher в автозагрузке. «Диспетчер задач → Автозагрузка»: запись должна быть одна. Если в системе стоят две сборки, старая продолжает делать своё.
  • Другая программа. Мы не единственные, кто так делал: похожим образом ведут себя некоторые переключатели раскладки и игровые утилиты. Если NeuroSwitcher удалён, а язык возвращается — дело не в нас, и это тоже полезно знать.
  • Синхронизация параметров Windows. При входе под учётной записью Microsoft языковые настройки могут приезжать с другого компьютера. «Параметры → Учётные записи → Резервное копирование Windows» → отключите синхронизацию языковых параметров и повторите уборку.

Не получилось — напишите нам

Пришлите вывод двух команд из раздела «Что именно осталось» и версию приложения из Консоли. Этого достаточно, чтобы ответить по делу, а не общими словами.

support@neuroswitcher.app — или через форму обратной связи.

И спасибо тем, кто написал об этом вместо того, чтобы молча удалить программу. Обе правки — и в 0.7.1, и в 0.7.2 — появились из таких писем.

Скачать свежую версию