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. Просто в произвольные моменты перестает переключать. Комп стационарный, в сон вгоняю постоянно вместо выключения.
А чем не нравится kbdxenru от хабровчанина?
Ну, наверное, тем, что когда я эти все варианты перебирал, его не нашёл :) Насколько подсказывает быстрое гугление, это раскладка, сделанная с помощью MS Keyboard Layout Creator. Точно помню, что эту софтину я ставил, ковырялся с ней, но удовлетворительного результата не достиг. Но уже не помню, почему именно.
Надо посмотреть как-нибудь на досуге и на этот вариант, спасибо.
Поставить в планировщике задач их перезапуск каждые сутки - не решило бы проблему?
А я пользуюсь группами переключения: по Alt+Shift переключаю "En" и "Be/Ru"; в группе "Be/Ru" по Ctrl+Shift переключаю "Be" и "Ru".
И это стандартная функция в Windows 10 (в Windows 7 тоже есть, но в группе переключается только мышкой)
Послушайте, ну есть же стандартный способ переключения — вешаем разные языки на Alt+Shift+1, Alt+Shift+2 и так далее. Или даже используя Ctrl-Shift, если неохота пальцы "корячить".
Спасибо!
Чем Thunisoft Huayu Pinyin лучше 搜狗输入, какие преимущества?
Рекламу и новости не показывает. (У меня версия 7.1.3.154). После того, как Google Pinin приказал долго жить, тоже пользовался 搜狗, но там удалял модуль показа рекламы, который был отдельным экзешником. В итоге, оно изредка ругалось, но это было меньшее зло чем постоянно всплывающие баннеры... Возможно, была возможность их просто отключить в настройках, но что-то тогда не нашёл где...
Под Win7 пользуюсь Mahou. Между двумя раскладками переключаюсь Ctrl+Shift, третью включаю Alt+Shift. Заодно решается вопрос с переключением раскладок во ВСЕХ окнах, как в десятке. Т.е. если в одном окне включил EN, то при переходе к другому тоже будет EN (автоматом быстро переключается).
Пользуюсь MKey, но программка уже заброшена и не развивается. Также бывают некоторые глюки с ней:
1) Иногда она подвисает и перестаёт работать, надо через интерфейс в трее выключить и включить.
2) Через несколько тысяч нажатий она выкидывает окно с просьбой доната, в норме активный пользователь ПК должен видеть такое окно 1-2 раза в год, но у меня есть USB-устройство, которое постоянно передаёт данные, воспринимаемые этой программкой как нажатия на клавиатуру, и окошко выскакивает несколько раз в день, что бесит.
3) Иногда фактический язык и отображаемый в трее не совпадают.
4) В некоторых текстбоксах (консоли, переименования файлов и папок в некоторых случаях) она не работает.
Надо будет попробовать Recaps.
А ещё лучше было бы, если б производители клавиатур стали с обратной стороны клавиатуры прикручивать маленький ползунковый переключатель, меняющий функцию CapsLock со стандартной на переключение языка (при этом Shift+CapsLock работало бы как стандартный CapsLock)...
Устал от этих костылей. Хочу клавиатуру, на которой будет три кнопки: укр, рус, англ.
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, предыдущую раскладку сохраняю.
А как побороли переключение в консоли?
Вот пример моего скрипта:
; Переключение языков по 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
}
ControlGetFocus, ctl
PostMessage 0x50, 3, %newLocale%, %ctl%, A
ммм зачем? прекрасно работает просто
PostMessage 0x50, 0x0, %newLocale%,, A
Действительно, это работает в консоли! Спасибо большое!
Действительно, это работает в консоли! Спасибо большое!
Автор, понимаю вашу боль, сам замучился с аналогичной задачей. На сегодняшний день нашёл таки хороший софт Keymanager, который вроде как все решает.
Спасибо
Win + [пробел]
После многих лет поиска решения, нашёл удобный вариант прямого переключения раскладки клавитуры с помощью двух-кнопчного сочетания 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
А есть в Windows 10 вариант "временного" переключения языка, пока нажата клавиша?
Ужасно бесит необходимость переключать язык, когда вводишь русский текст и нужно ввести что-то из символов <>#@$&~'
Покупаем игровую премногокнопочную мышь и вешаем на её кнопки стандартные комбинации клавиш Windows, на каждый язык по своей кнопке. Это удобней, чем циклическое переключение, потому что не нужно помнить, какой язык сейчас выбран.
Спасибо тебе добрый человек, за толчок на нужную программу.
Два способа управления языками ввода под Windows