1 (изменено: Lexanni, 2013-08-23 00:55:33)

Тема: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

Побродил по коллекции скриптов, и наткнулся на тему AutoHotkey: скрипт для ввода немецких умляутов, и решил рассказать о способе ввода спецсимволов, который использую я.

Я использую метод "мертвых клавиш", когда я нажимаю на такую "мертвую" клавишу, отпускаю ее, затем нажимаю, например, на клавишу "А" и у меня набирается "?". Или нажимаю мертвую клавишу, отпускаю ее, потом нажимаю "Shift+A", и у меня набирается "?". Вот пример скрипта:

CapsLock::return 
; Строка выше для того, чтобы в скрипте числилась горячая клавиша с именем "CapsLock".
; Режим CapsLock можно включать, нажимая на клавишу CapsLock с модификатором, например, Shift+CapsLock

#If A_PriorHotkey = "CapsLock"
    vk41::Send, ?  ; A
    +vk41::Send, ?   ; Shift+A
    vk53::Send, ?  ; S
    vk55::Send, ?  ; U
    +vk55::Send, ?  ; Shift+U
    vk4F::Send, ?  ; O
    +vk4F::Send, ?  ; Shift+O
#If

Особенности скрипта:
- Скрипт требует использования AutoHotkey_L.
- При записи "vk41::Send, ? " очень важно, чтобы скрипт был сохранен в кодировке UTF-8, т.к. вместо ? вы увидите кракозябр.
- Еще надо понимать, что эти комбо с мертвой клавишей будут работать во всех раскладках!
- А еще, если уж была нажата мертвая клавиша, то вывести ее из такого режима можно лишь нажав на одну из горячих клавиш, перечисленных в скрипте. Т.е. нажатая мертвая клавиша может помниться скриптом очень долго — пока не изменится значение переменной A_PriorHotkey. Т.е. можно нажать на CapsLock (в нашем случае), и набирать "Viele kleine Le?…" и только на букве u сработает горячая клавиша. Это не баг, а фича.

= = = = = = = = = = = =

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

>!vkBA::return ; RAlt+:
>!vk36::return ; RAlt+^

#If A_PriorHotkey = ">!vkBA"
    vk41::Send, ?  ; A
    +vk41::Send, ?   ; Shift+A
    vk55::Send, ?  ; U
    +vk55::Send, ?  ; Shift+U
    vk4F::Send, ?  ; O
    +vk4F::Send, ?  ; Shift+O
#If

#If A_PriorHotkey = ">!vk36"
    vk41::Send, ?  ; A
    +vk41::Send, ?   ; Shift+A
    vk55::Send, ?  ; U
    +vk55::Send, ?  ; Shift+U
    vk4F::Send, ?  ; O
    +vk4F::Send, ?  ; Shift+O
#If

То есть, если мы хотим набрать ?, то нам нужно сначала нажать RAlt+: (клавиша двоеточие в английской раскладке), а затем нажать на клавишу "О". Если мы хотим набирать ?, то нам нужно сначала нажать RAlt+^ (клавиша со знаком крышечки в английской раскладке), а потом нажать на клавишу "О". Если хотим набрать ?, то жмем сначала RAlt+:, а затем Shift+U.

= = = = = = = = = = = =

Еще в своем наборе я использую залипание клавиши Shift. Так, для того, чтобы набрать заглавную букву, мне не нужно удерживать нажатой клавишу Shift, т.е. фактически, я нажимаю клавишу Shift перед набираемым словом, и слово набирается с большой буквы. Вот скрипт:

~Shift::return 

#If A_PriorHotkey = "~Shift"

    vk51::+vk51  ; Й
    vk57::+vk57  ; Ц
    vk45::+vk45  ; У
    vk52::+vk52  ; К
    vk54::+vk54  ; Е
    vk59::+vk59  ; Н
    vk55::+vk55  ; Г
    vk49::+vk49  ; Ш
    vk4F::+vk4F  ; Щ
    vk50::+vk50  ; З
    vkDB::+vkDB  ; Х
    vkDD::+vkDD  ; Ъ
    
    vk41::+vk41  ; Ф
    vk53::+vk53  ; Ы
    vk44::+vk44  ; В
    vk46::+vk46  ; А
    vk47::+vk47  ; П
    vk48::+vk48  ; Р
    vk4A::+vk4A  ; О
    vk4B::+vk4B  ; Л
    vk4C::+vk4C  ; Д
    vkBA::+vkBA  ; Ж
    vkDE::+vkDE  ; Э
    
    vk5A::+vk5A  ; Я
    vk58::+vk58  ; Ч
    vk43::+vk43  ; С
    vk56::+vk56  ; М
    vk42::+vk42  ; И
    vk4E::+vk4E  ; Т
    vk4D::+vk4D  ; Ь
    vkBC::+vkBC  ; Б
    vkBE::+vkBE  ; Ю
    vkBF::+vkBF  ; .
    
    vkC0::+vkC0  ; Ё
    vk31::+vk31  ; 1
    vk32::+vk32  ; 2
    vk33::+vk33  ; 3
    vk34::+vk34  ; 4
    vk35::+vk35  ; 5
    vk36::+vk36  ; 6
    vk37::+vk37  ; 7
    vk38::+vk38  ; 8
    vk39::+vk39  ; 9
    vk30::+vk30  ; 0
    vkBD::+vkBD  ; -
    vkBB::+vkBB  ; =
    
#If

Скрипт работает во всех раскладках.

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

upd: Блина, все Юникод-символы сожрались движком форума... В общем, ребят, кто заинтересовался, качайте примеры в прикрепленном архиве.

Post's attachments

Примеры мертвых клавиш и залипания Shift.zip 914 b, 11 downloads since 2013-08-23 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

По залипанию шифта — шикарная штука! Весьма помогает.
Всё-же, практически следует ограничить время такого "залипания", а то нажал полчаса назад шифт, а он до сих пор залипши…
Также надо дать возможность отменить залипание ранее, чем истечёт "его время".

ST := 0
  return

~Shift::
  ST := 1
  settimer, ShiftTimer, 1000 ; Кол-во миллисекунд для сохранения состояния шифта
  return

#If A_PriorHotkey = "~Shift" and ST = 1

  BackSpace::return

    vk51::+vk51  ; Й
    vk57::+vk57  ; Ц
    vk45::+vk45  ; У
    vk52::+vk52  ; К
    vk54::+vk54  ; Е
    vk59::+vk59  ; Н
    vk55::+vk55  ; Г
    vk49::+vk49  ; Ш
    vk4F::+vk4F  ; Щ
    vk50::+vk50  ; З
    vkDB::+vkDB  ; Х
    vkDD::+vkDD  ; Ъ
    
    vk41::+vk41  ; Ф
    vk53::+vk53  ; Ы
    vk44::+vk44  ; В
    vk46::+vk46  ; А
    vk47::+vk47  ; П
    vk48::+vk48  ; Р
    vk4A::+vk4A  ; О
    vk4B::+vk4B  ; Л
    vk4C::+vk4C  ; Д
    vkBA::+vkBA  ; Ж
    vkDE::+vkDE  ; Э
    
    vk5A::+vk5A  ; Я
    vk58::+vk58  ; Ч
    vk43::+vk43  ; С
    vk56::+vk56  ; М
    vk42::+vk42  ; И
    vk4E::+vk4E  ; Т
    vk4D::+vk4D  ; Ь
    vkBC::+vkBC  ; Б
    vkBE::+vkBE  ; Ю
    vkBF::+vkBF  ; .
    
    vkC0::+vkC0  ; Ё
    vk31::+vk31  ; 1
    vk32::+vk32  ; 2
    vk33::+vk33  ; 3
    vk34::+vk34  ; 4
    vk35::+vk35  ; 5
    vk36::+vk36  ; 6
    vk37::+vk37  ; 7
    vk38::+vk38  ; 8
    vk39::+vk39  ; 9
    vk30::+vk30  ; 0
    vkBD::+vkBD  ; -
    vkBB::+vkBB  ; =
    
#If

ShiftTimer:
  ST := 0
  return 

3 (изменено: serzh82saratov, 2014-04-07 10:42:19)

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

If A_PriorHotkey = "~Shift" and ST = 1

А каков смысл использования в условии A_PriorHotkey?
И зачем постоянно включенный таймер?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

Хм, действительно, я остановился на стадии «работает - не трогай»...
Надо подправить:

#If (A_PriorHotkey = "~Shift") and (ST = 1)

и

ShiftTimer:
  settimer, ShiftTimer, off
  ST := 0
  return 

5

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

Проще дописать минус.

 ~Shift::
  ST := 1
  settimer, ShiftTimer, -1000 
return


ShiftTimer:
  ST := 0
  return 

Вопрос в смысле проверки A_PriorHotkey. Проверки ST вполне достаточно. Участие A_PriorKey было бы понятно наполовину, но A_PriorHotkey  зачем.

 #If ST

По мне, тут вполне достаточно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6 (изменено: Steve Key, 2014-04-07 13:40:29)

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

serzh82saratov пишет:

Проще дописать минус.

Тут Вы совершенно правы, я это читал когда-то, но забыл, ибо программирую на AHK «от случая к случаю»...

serzh82saratov пишет:

Вопрос в смысле проверки A_PriorHotkey. Проверки ST вполне достаточно.

А вот тут Вы заблуждаетесь, если проверять только флаг, то шифт будет активен всегда ровно секунду (в нашем случае), даже если мы нажмём много буквенных клавиш, и все отобразятся заглавными, нам же нужно, чтобы именно одна буква «капитализировалась»...

7

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

Значит не правильно понял задачу. Но тогда зачем такой длинный код.


Shift:: 
    SendInput {Shift Down}
    Input, SingleKey, L1 T1 V
    SendInput {Shift Up} 
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

С многократными нажатиями Shift не хорошо получается, тогда может так:


Shift::  
    SendInput {Shift Down}
    SetTimer, ShiftUp, -1 
    Return
     
ShiftUp:
    Input, SingleKey, L1 T1 V 
    If ErrorLevel != NewInput
        SendInput {Shift Up} 
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

serzh82saratov пишет:

С многократными нажатиями Shift не хорошо получается, тогда может так:

Вот бы ещё сделать, чтобы таймер перезапускался заново при каждом нажатии Shift, а так он отрабатывает некую выдержку, затем новое нажатие его заново запускает.

10 (изменено: serzh82saratov, 2014-04-07 23:44:06)

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

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


Shift::  
    SendInput {Shift Down}
    Input
    SetTimer, ShiftUp, -1 
    Return
     
ShiftUp:
    Input, v, L1 T1 V 
    If ErrorLevel != NewInput
        SendInput {Shift Up} 
    Return

-------------

Вот бы ещё сделать, чтобы таймер перезапускался заново при каждом нажатии Shift, а так он отрабатывает некую выдержку, затем новое нажатие его заново запускает.

Ну он и перезапускается. А задержка 10 мс не может быть заметна. Без SetBatchLines это вообще таймаут выполнения строк кода.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

serzh82saratov пишет:

Ну он и перезапускается. А задержка 10 мс не может быть заметна.

Заметил, вот запущен FAR, там меню нижнее меняется в зависимости от нажатого шифта, в частности.
Беру и "долблю" (с запущенной Вашей программой, ессно!) по шифту — и вижу, что меню периодически меняется, когда бы таймер перезапускался, то оно бы "стояло" в форме "нажат шифт"…

12

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

Ну так это обработчик FAR реагирует на событие Shift Down, так как ему и положено, можете попробовать Shift без ~, событие Shift Up происходит только после последнего нажатия Shift через 1 секунду, смотрите:


~Shift::   
    ToolTip % (Start := A_TickCount) " {Shift Down}" 
    Input
    SetTimer, ShiftUp, -1
    Return
     
ShiftUp:
    Input, v, L1 T1 V
    If ErrorLevel != NewInput
        ToolTip % A_TickCount - Start " {Shift Up}"
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

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

А Вы какой таймер имеете ввиду?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

serzh82saratov пишет:

А Вы какой таймер имеете ввиду?

ShiftUp
Без ~ попробую.

15

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

Так это таймер без паузы, аналог команды GoSub. Сделано для того, чтобы не привязывать поток к хоткею. Это как раз и гарантирует перезапуск при каждом нажатии Shift.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Аналог "мертвых клавиш" и режима "залипания" клавиш

Steve Key пишет:

Без ~ попробую.

Без ~ работает, вроде, получше, но что-то не то?…
Попытаюсь понять, что не устраивает, отпишусь.