Присоединяюсь к вопросу про клавиатуру. Все-таки любые попытки длительно и в больших объемах работать с "усеченными" вариантами отдают мазохизмом. Если мышь работает (что уже хорошо), можно переключение наборов повесить на колесико. Включение/отключение режима - комбинацией Ctrl+Shift+Z.
#NoEnv
Keys:= {"vk51":["vk51","vk52","vk55","vk50"]
,"vk57":["vk57","vk54","vk49","vkDB"]
,"vk45":["vk45","vk59","vk4F","vkDD"]
,"vk41":["vk41","vk46","vk4A","vkBA"]
,"vk53":["vk53","vk47","vk4B","vkDE"]
,"vk44":["vk44","vk48","vk4C","vkDC"]
,"vk5A":["vk5A","vk56","vk4D","vkBF"]
,"vk58":["vk58","vk42","vkBC","vk8"]
,"vk43":["vk43","vk4E","vkBE","vkD"]}
Set:=1
Tips := {"English":["QWE`nASD`nZXC","RTY`nFGH`nVBN","UIO`nJKL`nM , .","P [ ]`n; ' \`n/B En"]
,"Russian":["ЙЦУ`nФЫВ`nЯЧС","КЕН`nАПР`nМИТ","ГШЩ`nОЛД`nЬБЮ","ЗХЪ`nЖЭ\`n.B En"]}
for k, v in Keys {
HotKey, if, Print
Hotkey, %k%, MKey
}
SetTimer, Watch, 50
return
^+vk5A:: Print:=!Print ; Ctrl+Shift+Z
#If Print
WheelUp::(Set<4)&&Set++
WheelDown::(Set>1)&&Set--
#If
MKey:
SendInput % "{" . Keys[A_ThisHotkey][Set] . "}"
Return
Watch:
Tooltip % Print? Tips[InputLayout()][Set] : ""
Return
InputLayout(window := "A") {
If !(hWnd := WinExist(window))
return
WinGetClass, Class
if (Class == "ConsoleWindowClass"){
WinGet, consolePID, PID
DllCall("AttachConsole", Ptr, consolePID)
VarSetCapacity(buff, 16)
DllCall("GetConsoleKeyboardLayoutName", Str, buff),
DllCall("FreeConsole")
langID := "0x" . SubStr(buff, -3)
}
Else langID := DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, hWnd, UInt, 0, Ptr), Ptr) & 0xFFFF
Size := (DllCall("GetLocaleInfo", UInt, langID, UInt, 0x1001, UInt, 0, UInt, 0) * 2) ; LOCALE_SENGLANGUAGE := 0x1001
VarSetCapacity(localeSig, Size, 0)
DllCall("GetLocaleInfo", UInt, langID, UInt, 0x1001, Str, localeSig, UInt, Size)
return localeSig
}