1

Тема: AHK: переключение раскладок клавиатуры по произвольным клавишам

Хочу предложить еще один удобный с моей точки зрения метод переключения раскладок.
Главная мысль, что переключать раскладки нужно одной клавишей, но эта клавиша должна быть разная для разных раскладок!
Внимательно изучив свою клавиатуру :-) нашел две идеально подходящие для этого клавиши!
Это "Правая Win" и "Правая меню". Клавиши удобно расположены рядом и никогда мною не используются.

Коды я взял из одноименной темы в разделе AutoHotkey и соответственно модифицировал.

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
}

AppsKey::
    PostMessage, 0x50, 0, 0x4190419,, A     
    kbd_msg("RU")   
Return

RWin::
    PostMessage, 0x50, 0, 0x4090409,, A
    kbd_msg("EN")    
Return

И еще хочу попросить помощь зала в таком вопросе.
Русская раскладка у меня не стандартная, а модифицированная с помощью Microsoft Keyboard Layout Creator, там добавлены украинские символы через AltGr.
Так вот, при переключении с помощью скрипта, включается не эта раскладка, а стандартная Русская, хотя в системе установлена только одна - модифицированная.

Помогите добить идею!

2

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

В теме AutoHotkey: переключение раскладок клавиатуры по произвольным клавишам есть скрипты для определения установленной у Вас раскладки (вместо «0x4190419»).

3

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

alexii пишет:

В теме AutoHotkey: переключение раскладок клавиатуры по произвольным клавишам есть скрипты для определения установленной у Вас раскладки (вместо «0x4190419»).

Я там внимательно все изучил, когда свой вариант делал.
Дело в том, что первая функция возвращает 0xF0C00419 ( а если убрать последний операнд, то -0xF3FFBE7), а второй вариант просто -0xF3FFBE7. Это тогда когда вручную включена моя модифицированная раскладка. Раскладка в этот момент работает.
Но вызов команды
PostMessage, 0x50, 0, 0xполученный_код,, A
просто не меняет текущую раскладку.

Где-то нестыковка.

Могу для полноты картины сообщить что у меня Win7 x64 и AutoHotkey_L x64

4

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Для настоящей полноты желательно пощупать проблему вживую. Можете где-нибудь выложить свою раскладку, вместе с инструкцией, как её установить?

5

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Alpha, я как раз так и делал. У меня была так же установлена своя раскладка, сделанная (в то время) с помощью «Microsoft Keyboard Layout Creator 1.3.4073». И было отличное от «0x4190419» значение. Я поменял в скрипте переключения раскладок «0x4190419» на своё, и скрипт заработал. Какое значение возвращалось, и как я его подставлял — уже не скажу, не помню.

YMP, раскладка представляет собой *.msi пакет с единственной библиотекой *.dll внутри. Устанавливается обычным образом, можно даже в параллель с обычной русской раскладкой. Для удаления установленной раскладки — данная раскладка не должна быть текущей/умолчальной). Насколько помню, у меня не требовалась даже перезагрузка для сих действий (под XP).

6 (изменено: Alpha, 2011-01-10 00:25:16)

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Вобщем ситуация такая.
Я долго еще пытался получить "правильный код", даже ковырялся в самой dllке, выковыривая оттуда все что похоже на 419.
Изучал интернет на тему GetKeyboardLayout.
А в один прекрасный момент все заработало с самым начальным кодом 0x4190419
Возможно перезагрузка помогла?
И что интересно, обе процедуры получения кода все равно показывают другие значения.
BTW, 0x0C00 это Default custom locale language, а GetKeyboardLayout выдавал мне похожее значение 0xF0C00, но я пробовал все эти варианты - не помогало.

Так что будем считать, что все работает.

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

7

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Потестил код из первого окна. Вместо RWin поставил привычный мне Rctrl и Lctrl, конечно c тильдами впереди.
  Работает отлично, за исключением одной ситуации. Если была включена русская раскладка, то вместо выделения текста Ctrl+A просто напишет "a". И так со всеми остальными стандартными комбинациями.
  Можно как-то этого избежать?

8

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Конечно. AutoHotkey: Начинающему разработчику - Печатаю виртуальными кодами

9

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Вроде бы сработало. Но даже представить себе не могу как замена LCtrl на vkA2 могла на это повлиять? Модификаторы вроде же не зависят от раскладки?

10

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Нет, я имел в виду замену буквы "а" на код. А Ctrl в любой раскладке одинаково называется.

11

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Я про "а" не в скрипте, а в обычном использовании при физических нажатиях на клавиши. Также было и с "v" и т.д. А теперь когда я заменил Ctrl на сканкод стало работать нормально. Что за тайная магия?

12

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Понятно. Не знаю, что за приколы. Я переключаю тоже Ctrl'ом, правда общим, а не отдельно левым и правым, и таких глюков не наблюдаю. Кстати, советую вам усовершенствовать код, чтобы переключение посылалось в контрол окна, который в фокусе. Иначе переключение не работает в некоторых диалоговых окнах.


Ctrl::
    WinExist("A")
    ControlGetFocus, CtrlFocus
    PostMessage, 0x50, 0, 0x4190419, %CtrlFocus%
Return

13

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Да, так лучше.

14

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Хорошо бы ещё ввести отмену переключения раскладки, если кроме клавиши переключения до её отпускания, была нажата ещё какая-то клавиша. Чтобы использование клавиш модификаторов в традиционных целях не переключало раскладку.

15

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

С общим Ctrl'ом так всё и работает. Для разных попробуйте это:


~RCtrl Up::
    If (A_PriorKey = "RControl") {
        WinExist("A")
        ControlGetFocus, CtrlFocus
        PostMessage, 0x50, 0, 0x4190419, %CtrlFocus%
    }
Return

~LCtrl Up::
    If (A_PriorKey = "LControl") {
        WinExist("A")
        ControlGetFocus, CtrlFocus
        PostMessage, 0x50, 0, 0x4090409, %CtrlFocus%
    }
Return

16

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Отлично работает, спасибо!  Думаю, что можно в постоянные добавить. А в сочетании с http://forum.script-coding.com/viewtopic.php?id=7186 будет вообще отличная замена punto.

17

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

И ещё не всё. Мышь как-то можно учесть?  Иначе, например при открытии закладок в новом окне в броузере "Ctrl" + левый клик мыши всё равно происходит переключение.

18

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Как вариант:


~RCtrl Up::
    If (A_PriorKey = "RControl" && !Mouse) {
        WinExist("A")
        ControlGetFocus, CtrlFocus
        PostMessage, 0x50, 0, 0x4190419, %CtrlFocus%
    }
    Mouse := 0
Return

~LCtrl Up::
    If (A_PriorKey = "LControl" && !Mouse) {
        WinExist("A")
        ControlGetFocus, CtrlFocus
        PostMessage, 0x50, 0, 0x4090409, %CtrlFocus%
    }
    Mouse := 0
Return

~^LButton:: Mouse := 1

19 (изменено: Dimox, 2014-08-04 13:55:12)

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Подскажите, пожалуйста. Мне нужно то же самое, только вместо Ctrl хочу использовать Shift. В скрипте из поста №18 достаточно поменять RCtrl и LCtrl на RShift и LShift? Или еще нужно что-то поставить вместо RControl и LControl?

20

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Да, их тоже заменить на соответствующие шифты.

21

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Большое спасибо!

22

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

переключение раскладки с основной на дополнительному по двойному нажатию на левый CTRL


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

не судите строго, сегодня только познакомился с синтаксисом и командами:

;
; ================ переключить раскладку по нажатию на левый CTRL 2 раза по 0.1 сек с таким же промежутком
; паузу между нажатиями компенсируем в длительности второго нажатия (или sleep(50 - ms))
;
~LControl::
KeyWait, LControl, T0.1
if ErrorLevel = 1                                        ; если уложились в 0.1 сек
    Return    
KeyWait, LControl, D T0.2                        ; ждем второго быстрого нажатия
if ErrorLevel = 0    
    PostMessage, 0x50, 2,,, A                    ; переключаем раскладку
Return

23

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Знакомому передал вот такой код для удобства переключения.

;~Rctrl::
~vkA3 Up::
If (A_PriorKey = "RControl"  && !Mouse)
	{
    WinExist("A")
    ControlGetFocus, CtrlFocus
    PostMessage, 0x50, 0, -0xF3FFBE7, %CtrlFocus%
    kbd_msg("RU") 
	}
Mouse := 0	
Return

~vkA2 Up::
If (A_PriorKey = "LControl" && !Mouse)
	{
	WinExist("A")
    ControlGetFocus, CtrlFocus
    PostMessage, 0x050, 0, 0x04070407,%CtrlFocus%
    kbd_msg("DE")
	}
Mouse := 0	
Return

Return


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
}

  Всё работало отлично. Сейчас у него новый комп и включается только русский.
  Очевидно не совпадает второй идентификатор.
  Но код из другой темы почему-то не помог.

F11::
  Count:=DllCall("GetKeyboardLayoutList", UInt, 0, UInt, 0)
  VarSetCapacity(Buf, Count*4)
  DllCall("GetKeyboardLayoutList", UInt, Count, UInt, &Buf)
  List:=""
  SetFormat, Integer, H
  Loop, % Count
    List.=NumGet(Buf, (A_Index-1)*4) . "`n"
Return

  Показывает только один идентификатор и тот, уже известный.
  Посоветуйте, пожалуйста, что нужно изменить, чтобы определить все идентификаторы.

24

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Правильно так:

layoutNumber := DllCall("GetKeyboardLayoutList", "Int", 0, "Ptr", 0)
VarSetCapacity(buff, A_PtrSize * layoutNumber)
DllCall("GetKeyboardLayoutList", "Int", layoutNumber, "Ptr", &buff)
Loop % layoutNumber
   layoutList .= Format("{:#x}", NumGet(&buff + A_PtrSize*(A_Index - 1), "UInt")) . "`n"
MsgBox, % layoutList
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

25

Re: AHK: переключение раскладок клавиатуры по произвольным клавишам

Спасибо, отлично работает.