1 (изменено: OmTatSat, 2017-01-20 01:18:22)

Тема: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Здравствуйте, нужны диакритические знаки для букв. Написался скрипт замены обычных букв диакритическими, но хоткей с зажатием shift ctrl и alt ломают управление программами, по этому хочется чтобы нажать и отпустить shift к примеру потом при нажатии v(м) получу одноразовый хоткей с м̇, при след нажатии v(м) получу обычные v(м) даже если хоткей v(м) не был нажат, а была нажата любая клавиша.

Вот что придумалось:

*~shift::точка_врехняя = 1

#if (точка_врехняя = 1)
vk56::
send, м̇
точка_врехняя = 0
return

Но, не совсем то, что нужно, во первых хоткей не отключится при нажатии любой клавиши, во вторых в каждый хоткей добавлять выключатель "точка_врехняя = 0" как-то не верится что нет лучшего решения.
Подскажите пожалуйста более правильное решение.

2 (изменено: svoboden, 2017-02-08 23:33:51)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

И где же тут диакритические знаки, знак акцента после "м", что ли? Если да, то через команду "Hotkey" можно. Например, так:

state := 0
state1 := 1

vkA1:: Hotkey, sc2F, MyLabel, % (state1:=!state) and (state:=state)
 ? "off" : "on"

MyLabel:
send, м̇
Hotkey, sc2F, MyLabel, off
return

В примере используется правый shift, вместо левого, чтобы не конфликтовал с программами.

3 (изменено: svoboden, 2017-01-18 23:50:51)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Так ваш вариант, тоже работает. Чем не подошел?

4

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Да, весь список такой.

А̄ а̄ а̃  Ɔ ɔ Д̣ д̣ М̇ м̇ Н̃ н̃ Н̣ н̣ Н̇ н̇ ɞ `nӢ ӣ Ӯ ӯ Р̣ р̣ Т̣ т̣ Ш̇ ш̇ Ш́ ш́ Ш̣ ш̣ Х̣ х̣

как мне теперь туда добавить буквы?

Раньше у меня так было


...
*+vk59::send, н̇ 
return
*#+vk59::send, Н̇
return

*^vk59::send, н̣
return
*#^vk59::send, Н̣
return

*+^!vk59::send, н̃
return
*#+^!vk59::send, Н̃
return


*+^!vk46::Send, а̃
return


*!vk46::send, а̄
return
*#!vk46::send, А̄ 
return

Что значит?

? "off" : "on"

И как работает ваше решение, можете пожалуйста логику объяснить? А то я смотрю вообще не пойму. Единственное что понятно при нажатии м переход на mylabel)).

5

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

И почему вы использовали sc2F заместо vk56? Есть какие-то преимущества?

6 (изменено: svoboden, 2017-03-11 01:52:06)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Для каждой буквы, создавайте свои метки и вставляйте туда свои команды. Насчет "sc2F", скан-коды, как бы понадёжнее работают, иногда, а: ? "off" : "on" - это тетрардный оператор, похоже на: if, else, только сокращённей. Логика такая: команда "Hotkey", включает нужную метку и выключает ее.

7 (изменено: Malcev, 2017-01-19 01:01:05)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

скан-коды, как бы понадёжнее работают, иногда

А пример можно?
Я придерживаюсь противоположного мнения.

8 (изменено: svoboden, 2017-01-19 01:09:53)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Допустим, пример выше, сканд-коды работают, а виртуальные кнопки вообще не работают.

9

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

У меня работает:

state := 0
state1 := 1

vkA1:: Hotkey, vk56, MyLabel, % (state1:=!state) and (state:=state)
 ? "off" : "on"

MyLabel:
send, м̇
Hotkey, vk56, MyLabel, off
return

Ранее уже обсуждали разницу;
http://forum.script-coding.com/viewtopi … 39&p=5

10 (изменено: svoboden, 2017-01-19 01:36:40)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

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

11

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Можно пример, как добавить буквы?

Так.

state := 0
state1 := 1

shift:: 
Hotkey, sc2F, MyLabel, % (state1:=!state) and (state:=state)
 ? "off" : "on"
Hotkey, vk59, MyLabel-H, % (state1:=!state) and (state:=state)
 ? "off" : "on"
 
MyLabel:
send, м̇
Hotkey, sc2F, MyLabel, off
return



MyLabel-H:
send, н̇ 
Hotkey, sc2F, MyLabel-H, off
return

Не получается.

И ещё, можно сделать чтобы хоткей отключался при нажатии любой кнопки, заместо только указанной?

12 (изменено: svoboden, 2017-03-11 01:55:00)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

state := 0

vkA1:: ; RShift
Hotkey, vk56, MyLabel, state:=!state ? "off" : "on"
Hotkey, vk59, MyLabelH, state:=!state ? "off" : "on"
 return
 
MyLabel:
SendInput, 2323
Hotkey, vk56, MyLabel, off
return

MyLabelH:
SendInput, 1212
Hotkey, vk59, MyLabelH, off
return

Так никакие кнопки не указаны, одно нажатие на "включение", другое на "выключение". В метке уже прописана команда "Hotkey, vk56, MyLabel, off", которая отключает нужную кнопку. Если ты отключишь "RShift", например, как потом ты его включишь? Если надо, отключить весь скрипт, команды: "Suspend", "ExitApp", в метку прописывать надо. Только потом, скрипт надо будет запускать или включать заново.

13

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

А что за?

SendInput, 2323

И такой подход не совсем то, что нужно, так как каждый хоткей нужно отключать отдельно. Я нажал н след нажатие уже обычная н, но даже через сотни нажатий других клавиш, м выстрелит с диакритикой при её первом нажатии((

14

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Вот такое насочинялось.

*~alt::
палочка = 1

  AnyKeyWait()
  
  gosub, stophotkey
  return
  
return

 stophotkey:
  Sleep, 10 

   палочка = 0
 return
  #if (палочка = 1)
  vk45::
  send, "ӯ
return

vk46::
send, "а̄
  return
  
  vk42::send, "ӣ 
  return

AnyKeyWait() { 
   Input, L, L1 
}

Только подкорректировать бы его, а то первое нажатие букв которых нет в хоткеях происходит пустым, а последующие нажатия уже обычные буквы. Выходит, что AnyKeyWait() съедает нажатие? Можно ли сделать чтобы он отрабатывал и в то же время сохранил вывод букв?

15 (изменено: svoboden, 2017-03-11 02:34:41)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

OmTatSat, так скрипты у вас работают. Ну, так создайте любые условия, внутри команд, меток и т.д, которые вам нужны. Их много можно придумать разных.

16

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

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

17 (изменено: svoboden, 2017-02-08 23:38:17)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Так вообще, зачем так задумывать скрипт? Много разных условий, в коде, будут только тормозить нажатие клавиш. По автозамене не легче ли? Диакритика с помощью автозамен.

18

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Мне кажется вы усложняете.

#if (A_PriorKey = "LShift")
a::send 11
b::send 22
#if

19 (изменено: svoboden, 2017-01-19 20:39:51)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Вот ваш скрипт, если по автозамене не получится. Исправленный вариант:

   alt::
   палочка = 1

   AnyKeyWait()
  
   палочка = 0
   return

   #if (палочка = 1)

   vk31::
   SendInput 123
   return

   vk32::
   SendInput 234
   return

   AnyKeyWait() {
   Input, var, V L1
   }
   return

20

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Malcev
Интересный вариант, своей простотой, но он также теряет буквы, при первом нажатии, которые не указаны(.

21

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

svoboden
С автозаменой пока не понял преимущества. Но код который вы написали делает то, что нужно - печатает буквы при первом нажатии которые не указаны как хоткеи! Спасибо!

22

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

OmTatSat
Оверквотинг удалён. Следите за исполнением правил.

23

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

OmTatSat, не понял, при каких обстоятельствах теряет.
Вроде, ничего терять не должен.

24 (изменено: svoboden, 2017-01-20 00:00:05)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Malcev, так и виртуальные кнопки тоже не работали.

25 (изменено: OmTatSat, 2017-01-20 01:34:20)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Malcev блин, серьёзно, не теряет! Видимо у меня был запущен какой-то скрипт тестовый, который всё ломал, сейчас включаю и всё норм работает... Спасибо, буду в курсе про ваш вариант. Уже успел всё переделать под anykeywait...

Вот что получилось.

MsgBox, Ctrl & F1 - вызов помощи

  *~alt::
   палочка = 1

   AnyKeyWait()
  
   палочка = 0
   return

   #if (палочка = 1)

  vk45::sendinput, ӯ
return
*+vk45::sendinput, Ӯ
return

vk46::SendInput, а̄
return
*+vk46::SendInput, А̄ 
return

vk43::SendInput, ɔ
return
*+vk43::SendInput, Ɔ
return


vk44::SendInput, ɞ
return

vk42::SendInput, ӣ 
return
*+vk42::SendInput, Ӣ 
return
#if




 *^Shift::      
   волна = 1

   AnyKeyWait()
  
   волна = 0
   return

   #if (волна = 1)

vk59::SendInput, н̃
return
*+vk59::SendInput, Н̃
return


vk46::SendInput, а̃
return
*+vk46::SendInput, А̃
return
#if







~shift::
   точка_в = 1

   AnyKeyWait()
  
   точка_в = 0
   return

   #if (точка_в = 1)
   
vk56::sendinput, м̇
return
*+vk56::sendinput, М̇
return

vk59::SendInput, н̇ 
return
*+vk59::SendInput, Н̇
return

vk49::SendInput, ш̇ 
return
*+vk49::SendInput, Ш̇
return
#if




 *~Ctrl::      
   точка_н = 1

   AnyKeyWait()
  
   точка_н = 0
   return

   #if (точка_н = 1)

vk59::sendinput, н̣
return
*+vk59::SendInput, Н̣
return

vk4c::send, д̣
return
*+vk4c::send, Д̣
return

vk48::SendInput, р̣
return
*+vk48::SendInput, Р̣
return

vk4e::SendInput, т̣
return
*+vk4e::SendInput, Т̣
return

vk49::SendInput, ш̣
return
*+vk49::SendInput, Ш̣
return

vkdb::SendInput, х̣
return
*+vkdb::SendInput,  Х̣
return
#if







*~+Ctrl::      
   запятая_в = 1

   AnyKeyWait()
  
   запятая_в = 0
   return

   #if (запятая_в = 1)

vk49::SendInput, ш́ 
return
*+vk49::SendInput, Ш́
return
#if

^f1::
Gui Add, Text, x7 y0 left
,  Нажать и отпустить клавишу для печати`nследующей буквы с указанной диакритикой. `n`nAlt - палочка и ɔ, ɞ `nShift - точка верхняя `nCtrl - точка нижняя `nCtrl + Shift - волнистая `nShift + Ctrl - запятая верхняя `n`nДоступные буквы: `nА̄ а̄ А̃ а̃  Ɔ ɔ Д̣ д̣ М̇ м̇ Н̃ н̃ Н̣ н̣ Н̇ н̇ ɞ `nӢ ӣ Ӯ ӯ Р̣ р̣ Т̣ т̣ Ш̇ ш̇ Ш́ ш́ Ш̣ ш̣ Х̣ х̣
Gui, Show, NA x0 y0 w250 h163






   AnyKeyWait() {
   Input, var, V L1
   }
   return

26

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

svoboden пишет:

так и виртуальные кнопки тоже не работали.

У меня вроде работает так.

#if (A_PriorKey = "LShift")
vk59::SendInput, н̇ 
#if

27

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Как думаете стоит ли переделывать на A_PriorKey? Есть ли выигрыш в скорости или большее количество ситуаций в которых всё будет работать как надо?

28 (изменено: OmTatSat, 2017-01-20 01:15:13)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

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

#if (A_PriorKey = "^Shift")
vk59::SendInput, н̇ 
b::send 22
#if

29 (изменено: OmTatSat, 2017-01-20 01:16:41)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

#if (A_PriorKey = "Ctrl & Shift")

Тоже не работает.

30

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Так можно:

list := {LShift_a:"00", LControl_a:"11", LControlLShift_a:"22", LShiftLControl_a:"33", LShift_b:"44", LControl_b:"55", LControlLShift_b:"66", LShiftLControl_b:"77"}

~LShift::
~LControl::
key := SubStr(A_ThisHotKey, 2)
if (key != A_PriorKey) and ((A_PriorKey = "LControl") or (A_PriorKey = "LShift"))
   key := A_PriorKey key
return

#if (A_PriorKey = "LControl") or (A_PriorKey = "LShift")
a::
b::
Send % list[key "_" A_ThisHotkey]
return
#if

31 (изменено: svoboden, 2017-01-21 03:10:59)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Это я про свои виртуальные кнопки говорил, у меня они не работали.
А так, вот еще такой вариант есть:

state := 0

vkA0:: ; LShift
sdf = 1
size()
sdf = 0
Hotkey, vk56, MyLabel, state:=!state ? "off" : "on"
Hotkey, vk59, MyLabelH, state:=!state ? "off" : "on"
return
 
MyLabel:
#if (sdf = 1)
vk56:: ; м
SendInput 123
Hotkey, vk56, MyLabel, off
return

MyLabelH:
#if (sdf = 1)
vk59:: ; н
SendInput, 1212
Hotkey, vk59, MyLabel, off
return

size() {
Input, qwe, V L1,
(
{LControl}{RControl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{RWin}{AppsKey}
{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}
{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}
{Del}{Ins}{BS}{Capslock}{Numlock}{PrintScreen}{Pause}
)
}
return

32 (изменено: Malcev, 2017-01-20 17:23:41)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Если же нужно разделить LCtrl, LShift, LCtrl+LShift, LShift+LControl, то можно так:

list := {"~LShift_a":"00", "~LControl_a":"11", "~<^LShift_a":"22", "~<+LControl_a":"33", "~LShift_b":"44", "~LControl_b":"55", "~<^LShift_b":"66", "~<+LControl_b":"77"}

~LShift::
~LControl::
~<^LShift::
~<+LControl::
If (A_ThisHotkey = "~LShift") or (A_ThisHotkey = "~LControl")
   key := SubStr(A_ThisHotKey, 2)
else
{
   key := SubStr(A_ThisHotKey, 4)
   Hotkey, % key, Off
   KeyWait, % key
   Hotkey, % key, On
}
return

#if (A_PriorKey = key) and (key != "")
a::
b::
Send % list[A_PriorHotKey "_" A_ThisHotkey]
return
#if

Кстати ваша функция AnyKeyWait() реагирует не на все нажатия.
Например нажмите f1:

Input, var, V L1
msgbox % var

33 (изменено: svoboden, 2017-01-21 02:42:30)

Re: AHK: Включить hotkey мульти хоткеем на одно следующее нажатие

Malcev,

Input, SingleKey, V L1,
(
{LControl}{RControl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{RWin}{AppsKey}
{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}
{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}
{Del}{Ins}{BS}{Capslock}{Numlock}{PrintScreen}{Pause}
)
msgbox % SingleKey
ExitApp