Pull to refresh

Comments 63

А в консоли что работает? Системное переключение по тем же клавишам? Или как-то по другому?

В консоли работает только системное переключение. А перехват Alt+Shift ни в скрипте, ни в программе ReCaps не работает. Естественно, Alt+Shift при этом уже не является системным, оно освобождается в настройках, чтоб его можно было перехватывать...

Как это не работает? Только-что проверил

Alt & Shift::
MsgBox Hello!
return

Выскакивает окошко с сообщением, языки не переключаются.

А вообще, языки можно пропускать, чтобы их не было в цикле переключения.
Только их нужно не прямо в языки добавлять, а зайти в настройки одного или всех языков и там уже добавить нужную клавиатуру.
То есть, языки "первого уровня" будут переключаться по Alt+Shift. А внутри каждого языка раскладки клавиатур будут переключаться по Ctr+Shift (или какую вы там настроите комбинацию).

Может это и не совсем то, что вы хотели, но это готовые системные средства без сторонних программ.

Я начал было смотреть в сторону раскладок, но бросил. Помня, как иногда переклинивает переключатель в Windows, решил оставить всё максимально стандартно и просто и обойтись сторонней программой. Мне просто нужно было добиться пропускания китайского при переключении по Alt+Shift... В Windows в эти настройки ещё ведь и не попадешь одним кликом ))

Да, спасибо за поправку! Именно, что нажатие клавиш перехватывает, не работает именно переключение

Я в своё время решал более простую задачу - просто переключение между двумя языками через CapsLock. Пробовал и скрипты AutoHotkey, и ReCaps, и lswitch, и какой-то caps-min-shift (это имя exe'шника, не помню, где его добыл). У всех этих вариантов был один недостаток - в один прекрасный момент они переставали работать, что лечилось только выгрузкой (убийством процесса) свитчера и его повторным запуском. Возможно, это связано с тем, что дело было на ноуте, который часто отправлялся в гибернацию/сон, но бесило жутко.

В итоге решилось ремаппингом CapsLock на Win+Space через PowerToys - это железобетонный вариант, который пока ни разу не подводил.

Интересно, сейчас у ReCaps уже нет этой проблемы? А то решение с PowerToys имеет свои ограничения.

Тьфу-тьфу за полгода ReCaps не слетал. Несколько раз за это время переключение заклинивало, но расклинивалось системным переключателем Win+Space и дальше продолжало работать без перезапуска программы. С чем было связано - не отследил.

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

Тестирую неделю. Иконки не было ни разу, но всё также отваливается после блокирования учетной записи по Win + L.

да, кстати, после блокировки слетает. в общем, у меня как-то проблемно все :)

Я забил и всё таки пошел использовать AHK скрипт(его скомпилить в exe можно и в автозагрузку). Автору рекапс помогает с тремя языками, мне же нужно просто переключение по CapsLock.

SetCapsLockState, AlwaysOff
+CapsLock::CapsLock

CapsLock::Send, {Shift down}{Ctrl down}{Ctrl up}{Shift up}
return

CapsLock включается по Shift+CapsLock. Если он совсем не нужен, то удаляем вторую строчку. Ну и Ctrl на Alt меняем, если раскладка через альт переключается.

После блокировки работает, буду дальше тестировать. Из плюсов - никаких менюшек не выскакивает как у PowerToys.

Там в настройках, напротив каждого языка, снимите "overlay hint", всплывающая иконка исчезнет. А на счёт нечёткого переключения - пожалуй, стоит написать разработчику. Будет полезно всем, если баг отловится...

О, спасибо! Сам не разобрался, что это так настраивается.

У меня главная проблема с Recaps – он требует 2 keydown + 2 keyup события для alt+shift, и я регулярно об это спотыкаюсь: например, пишу по-русски, хочу вставить Recaps, и привычка – нажать alt, shift, отпустить alt и нажать r (чтобы получить R) – но с Recaps так не работает, нужно вначале отпустить shift, чтобы завершилось переключение, а затем снова нажать shift и напечатать букву. На предыдущее письмо (с вопросом про флаги) автор мне не ответил – посмотрим, ответит ли на это.

PowerToys тоже костыль костыльный. Win+Space при переключении показывает свитчер языков, что в случае с двумя языками совсем ненужная вещь. И при активной печати это часто сбоит. То CapsLock чуть передержишь и дважды язык меняется, то интерфейс windows подтормозит и переключится с задержкой. Есть возможность переключать без свитчера по shift+ctrl(именно в таком порядке), но PowerToys отказывается так мапить кнопки.

PS Проверил рекапс, работает прекрасно!

Ну вот как раз всплывающее окошко как раз и бесит, да, когда быстро набираешь русский текст с английскими терминами, например, оно в углу мелькает как ненормальное :( Других проблем не замечал, так что для меня сейчас это лучший вариант.

А при вводе пароля на входе в Винду он работает?

В ту же коллекцию keyla. Просто в произвольные моменты перестает переключать. Комп стационарный, в сон вгоняю постоянно вместо выключения.

Тоже пользовался keyla и когда она перестала работать у меня думал починить (яжпрограммист), но вместо этого настроил autohotkey.

Ну, наверное, тем, что когда я эти все варианты перебирал, его не нашёл :) Насколько подсказывает быстрое гугление, это раскладка, сделанная с помощью MS Keyboard Layout Creator. Точно помню, что эту софтину я ставил, ковырялся с ней, но удовлетворительного результата не достиг. Но уже не помню, почему именно.

Надо посмотреть как-нибудь на досуге и на этот вариант, спасибо.

Единственное, что мне неприятно в ней — что диод горит на русскую раскладку, когда хотелось бы наоборот.

Поставить в планировщике задач их перезапуск каждые сутки - не решило бы проблему?

А я пользуюсь группами переключения: по Alt+Shift переключаю "En" и "Be/Ru"; в группе "Be/Ru" по Ctrl+Shift переключаю "Be" и "Ru".

И это стандартная функция в Windows 10 (в Windows 7 тоже есть, но в группе переключается только мышкой)

Подскажите, пожалуйста, где эти группы переключения найти в Win10?

@Yko2007 Какую комбинацию вы поставили на китайский язык?

Сейчас, когда почти не пользуюсь китайским, при надобности включаю его по Win+Space или вообще мышкой. Когда пользовался активно, то была карусель Ru-En-Ch на Alt+Shift

UFO just landed and posted this here

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

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

Конечно так можно. Но у меня задача была сохранить привычное переключение на Alt+Shift. Ну, вот, нравится мне оно. И при этом чтоб третий язык не мешал. Но и чтоб не удалять его из системы насовсем - изредка бывает нужет

Рекламу и новости не показывает. (У меня версия 7.1.3.154). После того, как Google Pinin приказал долго жить, тоже пользовался 搜狗, но там удалял модуль показа рекламы, который был отдельным экзешником. В итоге, оно изредка ругалось, но это было меньшее зло чем постоянно всплывающие баннеры... Возможно, была возможность их просто отключить в настройках, но что-то тогда не нашёл где...

Под Win7 пользуюсь Mahou. Между двумя раскладками переключаюсь Ctrl+Shift, третью включаю Alt+Shift. Заодно решается вопрос с переключением раскладок во ВСЕХ окнах, как в десятке. Т.е. если в одном окне включил EN, то при переходе к другому тоже будет EN (автоматом быстро переключается).

Она и в Win11 отлично работает. Только РУС/LAT у меня на ё, а УКР на КапсЛоке.

Пользуюсь MKey, но программка уже заброшена и не развивается. Также бывают некоторые глюки с ней:

1) Иногда она подвисает и перестаёт работать, надо через интерфейс в трее выключить и включить.

2) Через несколько тысяч нажатий она выкидывает окно с просьбой доната, в норме активный пользователь ПК должен видеть такое окно 1-2 раза в год, но у меня есть USB-устройство, которое постоянно передаёт данные, воспринимаемые этой программкой как нажатия на клавиатуру, и окошко выскакивает несколько раз в день, что бесит.

3) Иногда фактический язык и отображаемый в трее не совпадают.

4) В некоторых текстбоксах (консоли, переименования файлов и папок в некоторых случаях) она не работает.

Надо будет попробовать Recaps.

А ещё лучше было бы, если б производители клавиатур стали с обратной стороны клавиатуры прикручивать маленький ползунковый переключатель, меняющий функцию CapsLock со стандартной на переключение языка (при этом Shift+CapsLock работало бы как стандартный CapsLock)...

UFO just landed and posted this here
UFO just landed and posted this here

Устал от этих костылей. Хочу клавиатуру, на которой будет три кнопки: укр, рус, англ.

UFO just landed and posted this here

AutoHotkey-ем сделал перехват клавиш CapsLock, SrollLock и Pause/Break и "конвертацию" в "стандартные" Ctrl+Shift+1/2/3 на которых висят нужные мне En/Ru/Kk

В Вин10 работает везде железобетонно!

#Persistent
#SingleInstance
#KeyHistory 0
#NoEnv
#HotkeyModifierTimeout 100

SetNumLockState, AlwaysOn
SetCapsLockState, AlwaysOff
SetScrollLockState, AlwaysOff

CapsLock::^+1
Pause::^+2
ScrollLock::^+3

return

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

Вообще-то есть. и давно. Есть программируемые клавиатуры, как для кассовых аппаратов там на каждую кнопку можно назначить любую последовательность нажатий кнопок. Но тогда это было длвольно специализированное изделие и дорогое. Сейчас же их можно самому сделать, на ардуине, например.

Ппоблема трех раскладок решается двумя языками ввода, и для одного из них две раскладки клавиатуры. Язык ввода переключается ctrl-shift, а раскладка в пределах языка alt-shift. En, Ru, Ua. Английский (En)и украинский языки (две раскладки Ukr Ua и Ukr Ru).

Я настроил себе переключение тоже через AutoHotKey. Но я поборол проблемы с консолью.

Язык ввода меняю через длинное нажатие на LShift / RShift, предыдущую раскладку сохраняю.

А как побороли переключение в консоли?

Возможно я не совсем понимаю понятие "консоль". У меня в FAR и cmd переключает

Вот пример моего скрипта:

; Переключение языков по Shift, с сохранением раскладки для языка
; Левый - Английский
; Правый - Украинский, текущая клавиатура (на язык повешено 2 раскладки)
#NoEnv
#SingleInstance force

Process Priority,, High

layouts := GetLayoutList()

~LShift Up::
  if (A_PriorKey = "LShift") 
    SwtichLang(layouts, 1033) ; English
return

~RShift Up::
  if (A_PriorKey = "RShift") 
    SwtichLang(layouts, 1058) ; Ukraine
return

;~LShift Up::
;  if (A_PriorKey = "LShift") 
;    SwtichLang(layouts, 0)
;return

SwtichLang(ByRef layouts, LangId) {
  InputLocaleID := GetKeyboardLayout()
  lang := InputLocaleID & 0x0000FFFF 

  if (LangId == 0) {
    prev := 0
    for index, element in layouts {
      if (index == lang && prev != 0) {
        SwtichLang(layouts, prev)
        return
      } else 
        prev := index
    }
    if (prev != 0) {
      SwtichLang(layouts, prev)
      return
    }
  } else
  if (lang != LangId) {
    layouts[lang] := InputLocaleID  ; Сохраняем раскладку текущего языка
    newLocale := layouts[LangId]

    kbd_msg(Format("{:U}", GetLangName(LangId)))
;    Send, {Ctrl Down}{Shift Down}{Shift Up}{Ctrl Up}
    ControlGetFocus, ctl
    PostMessage 0x50, 3, %newLocale%, %ctl%, A
  }
}

GetKeyboardLayout() {
   hWnd := WinExist("A")

   WinGetClass, winClass
   if ((winClass != "ConsoleWindowClass") || (b := SubStr(A_OSVersion, 1, 2) = "10"))  {
      if b {
         dhw_prev := A_DetectHiddenWindows
         DetectHiddenWindows, On
         hWnd := WinExist("ahk_exe conhost.exe")
         DetectHiddenWindows, % dhw_prev
      }
      threadId := DllCall("GetWindowThreadProcessId", Ptr, hWnd, UInt, 0)
      lyt := DllCall("GetKeyboardLayout", Ptr, threadId, UInt)
      return lyt
   }
   else {
      WinGet, consolePID, PID
      DllCall("AttachConsole", Ptr, consolePID)
      VarSetCapacity(lyt, 16)
      DllCall("GetConsoleKeyboardLayoutName", Str, lyt)
      DllCall("FreeConsole")
      return lyt
   }
}

GetLayoutList() {
    aLayouts := []
    size := DllCall("GetKeyboardLayoutList", "UInt", 0, "Ptr", 0)
    VarSetCapacity(list, A_PtrSize*size)
    size := DllCall("GetKeyboardLayoutList", Int, size, Str, list)
    Loop % size { ; для каждого языка сохраняем одну раскладку
        aLayout := NumGet(list, A_PtrSize*(A_Index - 1))
        lang := aLayout & 0x0000FFFF
        if (aLayouts[lang] == null) 
          aLayouts[lang] := aLayout 
    }
    Return aLayouts
}

GetLangName(LocID, FullName = false) {
  static SISO639LANGNAME            := 0x0059 ; ISO abbreviated language name, eg "EN"
  static LOCALE_SENGLANGUAGE        := 0x1001 ; Full language name, eg "English"

  LCType := FullName ? LOCALE_SENGLANGUAGE : SISO639LANGNAME
  Size := (DllCall("GetLocaleInfo", UInt, LocID, UInt, LCType, UInt, 0, UInt, 0) * 2)
  VarSetCapacity(localeSig, Size, 0)
  DllCall("GetLocaleInfo", UInt, LocID, UInt, LCType, Str, localeSig, UInt, Size)
  Return localeSig
}

kbd_msg(text) {
  no_detect_window := -1
  ToolTip, %text%, A_CaretX + 10, A_CaretY - 20
  SetTimer, KbdRemoveToolTip, -1000
  return
    
  KbdRemoveToolTip:
  ToolTip
  no_detect_window := 1
  return
}
Что-то слишком тяжеловато что-ли. У меня попроще, только на контралах левая английская правая русская, ну и системное ctrl+shift switch.
ControlGetFocus, ctl
PostMessage 0x50, 3, %newLocale%, %ctl%, A

ммм зачем? прекрасно работает просто
PostMessage 0x50, 0x0, %newLocale%,, A

Действительно, это работает в консоли! Спасибо большое!

Действительно, это работает в консоли! Спасибо большое!

Автор, понимаю вашу боль, сам замучился с аналогичной задачей. На сегодняшний день нашёл таки хороший софт Keymanager, который вроде как все решает.

После многих лет поиска решения, нашёл удобный вариант прямого переключения раскладки клавитуры с помощью двух-кнопчного сочетания Alt+1, Alt+2, Alt-3, ...
Имплементация - на AutoHotkey, скрипт долщен быть запущен с повышенными привилегиями для тех у кого включен UAC. Работает везде, включая RDP, VNC, консоль и т.д.
Список кодов для нужного языка - здесь: Default Input Profiles (Input Locales) in Windows | Microsoft Docs.

#Persistent						 ; Do not get killed by errors
#InstallKeybdHook	     ; Install keyboard hook for extended hotkeys
#UseHook               ; Do not open Windws Start Menu on Win-kepress

en := DllCall("LoadKeyboardLayout", "Str", "00000409", "Int", 1)
ru := DllCall("LoadKeyboardLayout", "Str", "00000419", "Int", 1)
he := DllCall("LoadKeyboardLayout", "Str", "0000040D", "Int", 1)	

!1::									;  Alt+1				: US keyboard
	WinWait, A
	WinWaitActive, A
	ControlGetFocus, ctl, A
	PostMessage, 0x50, 0, %en%, %ctl%, A
	PostMessage, 0x50, 0, %en%,, A
	Return

!2::									;  Alt+1				: Hebrew keyboard
	WinWait, A
	WinWaitActive, A
	ControlGetFocus, ctl, A
	PostMessage, 0x50, 0, %he%, %ctl%, A
	PostMessage, 0x50, 0, %he%,, A
	Return
	
!3::									;  Alt+1				: Russian keyboard
	WinWait, A
	WinWaitActive, A
	ControlGetFocus, ctl, A
	PostMessage, 0x50, 0, %ru%, %ctl%, A
	PostMessage, 0x51, 0, %ru%,, A
	Return	

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

А есть в Windows 10 вариант "временного" переключения языка, пока нажата клавиша?

Ужасно бесит необходимость переключать язык, когда вводишь русский текст и нужно ввести что-то из символов <>#@$&~'

UFO just landed and posted this here

Тоже задумывался над такой проблемой пока основной язык был русский, когда язык сменился, то и проблема ушла.

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

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

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

Sign up to leave a comment.

Articles