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

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-10-02 10:31:29)

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

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, 2017-10-02 20:17:13)

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-10-02 21:21:15)

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

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-10-03 20:48:02)

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-10-04 09:57:47)

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