1 (изменено: vlad1986, 2017-10-02 07:24:51)

Тема: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

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

Как я хотел бы это сделать? Зажал Левый ALT + первую букву названия улицы, например н -- написалась Никитина, если при зажатом ALT нажал на н дважды -- Наумова,  при зажатом ALT нажал на н трижды -- некрасова, четырежды - нефтяников.

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


#UseHook On

н::
    KeyWait, %A_ThisHotkey%
    KeyWait, %A_ThisHotkey%, D T0.3
    If ErrorLevel
        Send, н      ; 1 нажатие, сама клавиша.
    Else
    {
        KeyWait, %A_ThisHotkey%
        KeyWait, %A_ThisHotkey%, D T0.3
        If ErrorLevel
            Никитина       ; 2 нажатия.
        Else
        {
            KeyWait, %A_ThisHotkey%
            KeyWait, %A_ThisHotkey%, D T0.3
            If ErrorLevel
                Send, Наумова   ; 3 нажатия.
            Else
                Send, Некрасова   ; 4 нажатия.
        }
    }
    Return

Как легко догадаться, скрипт срабатывает на названиях улиц с двойной н(например Конная), что конечно же только мешает набору. Поэтому хотелось бы задействовать еще какую-то клавишу (например Левый ALT, как писал выше), чтобы избежать случайного срабатывания скрипта. Подскажите пожалуйста, как можно это сделать?

2 (изменено: svoboden, 2017-10-02 07:48:10)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

Array := Object("Key1", "Value1", "Key2", "Value2")

$!vk59::
i++
a = Key%i%
MsgBox, % Array[a]
return

3

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

С моей точки зрения было бы логичнее:
CTRL + Н = Никитина,
ALT + Н = Наумова,
SHIFT + Н = Нефтяников.

А ещё лучше одиночное нажатие ALT, после которого разово срабатывают автозамены:
Ни = Никитина,
На = Наумова,
Не = Нефтяников.

4 (изменено: vlad1986, 2017-12-05 17:43:28)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

ypppu

Улиц планируется в скрипт загнать много, по 4 варианта на каждую заглавную букву, чередование CTRL, ALT, SHIFT может наоборот замедлить внос названий (т.к нужно вспоминать что на какой клавише находится)

А ещё лучше одиночное нажатие ALT, после которого разово срабатывают автозамены

Что вы имеете ввиду?

svoboden

Извините за глупый вопрос, что должно стоять вместо Key1 и Key2? с Value понятно.

5 (изменено: svoboden, 2017-10-02 09:03:34)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

Ничего стоять не должно, это номера ключей из массива: "Key1", "Key2", "Key3", "Key4" и т.д.

6 (изменено: vlad1986, 2017-12-05 17:44:01)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

svoboden

Спасибо большое за скрипт, но как сделать чтобы: 1) он не выполнялся буквально после каждого нажатия, а считал сколько раз я нажму эти клавиши, скажем за секунду и только после этого писал улицу (как я писал выше, будут и другие буквы, на них нужен отдельный счётчик?) 2) зациклился, тоесть после n-го нажатия считал заново, а не переходил в бездействие.

7 (изменено: svoboden, 2017-10-02 12:36:57)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

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

Array := Object("Key1", "Value1", "Key2", "Value2", "Key3", "Value3", "Key4", "Value4")

$vk59:: ; н
i++
a = Key%i%
if i = 4
i := ""
return

$Lalt Up:: ; н
MsgBox, % Array[a]
i := ""
return

Да, на другую клавишу нужен отдельный счетчик. Если хотите по времени записывать нажатия клавиш, то команду input можно использовать.

8

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

vlad1986 пишет:

Улиц планируется в скрипт загнать много, по 4 варианта на каждую заглавную букву, чередование CTRL, ALT, SHIFT может наоборот замедлить внос названий (т.к нужно вспоминать что на какой клавише находится)

как сделать чтобы: 1) он не выполнялся буквально после каждого нажатия, а считал сколько раз я нажму эти клавиши, скажем за секунду и только после этого писал улицу (как я писал выше, будут и другие буквы, на них нужен отдельный счётчик?)

Так всё-таки оператор будет держать в голове, то что Наумова - дважды, а нефтяников - четырежды? Если человек сможет всё это запомнить, то сможет запомнить и комбинации с CTRL, ALT, SHIFT.

А ещё лучше одиночное нажатие ALT, после которого разово срабатывают автозамены

Что вы имеете ввиду?

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

9 (изменено: svoboden, 2017-10-02 19:55:54)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

vlad1986, я бы вообще оставил первый вариант, т.к. в ходе перебора улиц, хотя-бы видна текущая улица:

Array := Array("Никитина", "Наумова", "Нефтяников")

$!vk59::
i++
a = %i%
if i = 3
i := ""
send ^+{Left}
send % Array[a]
return

10 (изменено: vlad1986, 2017-10-02 19:17:12)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

svoboden

Скрипт работает, как и просил. Но столкнулся с проблемой добавления новых букв. При запуске скрипт ругается если этот же Левый альт привязать к еще одной букве. Как добавлять новые клавиши в этот скрипт?

ypppu

Вы про этот скрипт?

11 (изменено: svoboden, 2017-10-02 19:03:52)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

"Левый" альт привязывать никуда не надо, надо на новую клавишу добавлять новый счетчик.

12 (изменено: vlad1986, 2017-12-06 22:03:32)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

svoboden

Извините за глупые вопросы(((.

В какой строке нужно сделать замену?

Array := Array("Никитина", "Наумова", "Нефтяников")

$!vk59::
i++
a = %i%
if i = 3
i := ""
send ^+{Left}
send % Array[a]
return

Array := Array("Фонтанская дорога", "Филатова", "Французский")

$!vk41::
i++
a = %i%
if i = 3
i := ""
send ^+{Left}
send % Array[a]
return

13

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

vlad1986, не, я не имел в виду тот скрипт.

Сейчас повсеместно в поисковиках внедряется "всплывающий ListBox". Набрал первую букву - выпал длинный список. Набрал вторую - список сузился. А стрелками клавиатуры можно пролистать и клавишей Enter выбрать нужное.
AHK: Предиктивный ввод текста в GUI

А про ALT я имел в виду как-нибудь так:

#If var = 1
::Ни::
Send, Никитина
var := 0
Return

::На::
Send,  Наумова
var := 0
Return

::Не:: 
Send, Нефтяников
var := 0
Return
#If

Alt:: var := 1

Вообще AutoHotkey идеально подходит для решения поставленной задачи.

14 (изменено: svoboden, 2018-04-02 03:12:45)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

vlad1986, так надо:

Array := Array("Никитина", "Наумова", "Нефтяников", "Фонтанская_дорога", "Филатова", "Французский")

h := 3

$!vk59::
i++
a = %i%
if i = 3
i := ""
send ^+{Left}
send % Array[a]
return

$!vk41::
h++
r = %h%
if h = 6
h := 3
send ^+{Left}
send % Array[r]
return

А так, - да, согласен, для Autohotke'я - это идеальная задача.

15 (изменено: vlad1986, 2017-10-02 20:41:50)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

ypppu пишет:

Набрал первую букву - выпал длинный список. Набрал вторую - список сузился.

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

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

А про ALT я имел в виду как-нибудь так

Одновременно нажимать НИ, а потом еще и Альт не очень удобно

svoboden

Спасибо огромное, Вы не могли бы показать пример с еще одной буквой? К.

Array := Array("Никитина", "Наумова", "Нефтяников", "Фонтанская_дорога", "Филатова", "Французский", "Ковалевского", "Королева", "Костанди")

Если будет еще один пример, то наверное пойму, как добавлять буквы дальше.

16

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

vlad1986, это работает не так. Нажимаешь и отпускаешь Alt. После пишешь "на" и нажимаешь пробел: появляется "Наумова". Можно и без нажатия пробела сделать.

17 (изменено: vlad1986, 2017-12-06 18:27:50)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

ypppu

Спасибо за идею и реализацию, и правда очень удобно. Можно автоматизировать все используемые названия. Круто!

P.S. Как заменить пробел на другую клавишу? Например сначала буквы, после них Альт (перед буквами ничего не нажимать).

18

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

vlad1986, ну, так, что там непонятного.

Array := Array("Никитина", "Наумова", "Нефтяников", "Фонтанская_дорога", "Филатова", "Первомайская", "Ковалевского", "Ленинская", "Дорожная")

k := 6

$!vk4B::
k++
t = %k%
if k = 9
k := 6
send ^+{Left}
send % Array[t]
return

19

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

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

#Hotstring b0

:*:Ни::
var := "Никитина"
Return

:*:На::
var := "Наумова"
Return

:*:Не:: 
var := "Нефтяников"
Return


Alt::
If var != 
Send, ^+{Left}%var% 
var := ""
Return

20 (изменено: vlad1986, 2017-12-06 22:04:33)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

svoboden пишет:

ну, так, что там непонятного.

Теперь все понятно, спасибо.

Но пока не получается с вариантом из поста №7 Если при добавлении новой буквы $Lalt Up:: указывается снова, то скрипт отказывается запускаться. Если эта строка пишется только 1 раз, то как заставить новую букву работать с Альтом?

ypppu

То, что нужно))). Я твой должник.

21 (изменено: svoboden, 2017-10-03 15:21:45)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

vlad1986 пишет:

Если при добавлении новой буквы $Lalt Up:: указывается снова, то скрипт отказывается запускаться.

А зачем на опускание "alt" запускать скрипт, если "alt" служит модификатором к нужной клавиши.

22 (изменено: vlad1986, 2017-12-06 18:26:56)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

svoboden

Приведите пожалуйста пример, как добавлять новые буквы в скрипт из поста №7, чтобы отпускание Альта работало и для них тоже. Я понимаю, что уже порядком уже поднадоел, но думаю это будет последняя просьба.

23 (изменено: svoboden, 2017-10-04 00:10:27)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

Array := Array("Никитина", "Наумова", "Нефтяников", "Ковалевского", "Ленинская", "Дорожная")

k := 3

$vk59:: ; н
i += 1
a = %i%
if i = 3
i := ""
return

$vk4B:: ; л
k += 1
a = %k%
if k = 6
k := 3
return

$Lalt Up::
send ^+{Left}
send % Array[a]
return

24 (изменено: vlad1986, 2017-12-06 18:26:30)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

Если запустить этот скрипт, то:

1) ни клавиша "н", ни "л" не работают вообще. (т.е сами по себе, если набираться вручную любое слово, где есть эти буквы, они просто не введутся).

2) Счетчик не сбрасывается, если нажать Альт+н он наберет Никитина, если через пару минут опять нажать Альт+Н (тоже 1 раз) он засчитает это как второе нажатие и уже не наберет Никитина, он введет Наумова.

25 (изменено: svoboden, 2017-10-04 20:17:45)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

Array := Array("Никитина", "Наумова", "Нефтяников", "Ковалевского", "Ленинская", "Дорожная")

k := 3

!vk59::
i += 1
a = %i%
if i = 3
i := ""
return

!vk4B::
k += 1
a = %k%
if k = 6
k := 3
return

~Lalt Up::
send ^+{Left}
send % Array[a]
i := "", k := 3
return

26 (изменено: stealzy, 2017-11-08 17:28:40)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

Хотел написать что автодополнение изобрели уже давно, и есть реализации на ahk (видел в scite for ahk).
Нашел скрипт от Uberi, который не понимал другие языки (кроме EN), и TypingAid (интересен, но просто так туда свой файл со списком для автодополнения не положить, т.к. хранится в бд и нужно писать туда, пока не ковырял его вобщем).
Немного переделал вариант Uberi для поддержки языков и по мелочи.
Прикладываю пример автодополнения по улицам всех городов России в окне блокнота-notepad (скрипт и файлик со списком улиц в одном архиве).
Если кто знает улицу, для которой нет подсказки, сообщите .

Post's attachments

AutoCompleteStreet.7z 96.01 kb, 7 downloads since 2017-11-08 

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

27 (изменено: vlad1986, 2017-12-06 18:25:49)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

stealzy

Ого, самый крутой скрипт по улицам, что я видел.. К сожалению я не разобрался, как его подружить с другими программами, чтобы при запущенном скрипте подсказки появлялись не только в блокноте, но и в любой другой программе, где я буду вводить названия улиц (например Дубль Гис,  Word, браузер).

P.S. Названия улиц из списка не выбираются через Enter, только двойной клик, в какой строке это можно исправить?

28

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

А разве тема была про автодополнение?

29 (изменено: vlad1986, 2017-12-06 18:25:04)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

svoboden

Желаемая цель не менялась -- быстрый ввод названий улиц. Вы и другие программисты подсказали более лучшие способы её достижения, чем тот, что я спрашивал изначально. За что всем огромное спасибо. Не создавать же отдельные темы про улицы. Заголовок темы могу отредактировать.

30 (изменено: svoboden, 2017-11-15 22:26:22)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

vlad1986 пишет:

Не создавать же отдельные темы про улицы.

Почему, можно создавать.

31 (изменено: teadrinker, 2017-11-15 23:53:39)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

stealzy пишет:

Если кто знает улицу, для которой нет подсказки, сообщите

Я знаю, Пражская.
UPD. Вообще-то в списке есть, но после ввода "Пра" не высвечивается, наверно баг.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

32 (изменено: stealzy, 2017-11-16 00:08:48)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

teadrinker, да, список стоп-клавиш остался от Uberi, нужно подчистить и перевести на Input механизм для мульти-языковой поддержки.

33 (изменено: vlad1986, 2017-12-06 18:20:55)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

svoboden

Пользуюсь вашим скриптом на работе, очень доволен. Но есть небольшая проблемка, он срабатывает даже есть просто нажать ALT (выводится название улицы, которое использовалось последний раз). Особенно это доставляет неудобства, когда пытаешься переключиться на другое окно (Alt+Tab) или поменять язык раскладки (Shift+Alt).

Баг актуален, даже если не в носить никаких изменений в примере, который Вы приводили:

+ Цитата Вашего кода
Array := Array("Никитина", "Наумова", "Нефтяников", "Ковалевского", "Ленинская", "Дорожная")

k := 3

!vk59::
i += 1
a = %i%
if i = 3
i := ""
return

!vk4B::
k += 1
a = %k%
if k = 6
k := 3
return

~Lalt Up::
send ^+{Left}
send % Array[a]
i := "", k := 3
return

Как это пофиксить?

34

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

Автозамены проще составлять, используя удвоенную опорную согласную, или удвоенную первую букву из названия — тогда необходимость в Alt и пробеле отпадает:


:*:Нкк::Никитина
Return

:*:Нмм::Наумова
Return

:*:Нфф::Нефтяников

:*:Нии::Никитина
Return

:*:Наа::Наумова
Return

:*:Нее::Нефтяников
Return

35

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

DD

Вопрос был по коду от svoboden, а не ypppu.

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

36

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

vlad1986

Это и было предложение по автозаменам и в нем также оговаривались легко запоминаемые сочетания по начальным буквам "Нии, Наа, Нее" и т.д. Когда берется любое название и удваивается вторая буква, так что в итоге нужно всего три нажатия, в третий раз — по той же клавише.

37 (изменено: svoboden, 2017-11-25 08:40:40)

Re: AHK: Зажатие одной клавиши + двойное (тройное) нажатие другой

vlad1986

Допишите:


~Alt::
Hotkey, Lalt Up, Off
return

А в каждый хоткей добавьте Hotkey, Lalt Up, On, кроме "~Lalt Up::".

Или используйте правый "alt" вместо левого.