1 (изменено: fgslm, 2020-07-23 23:43:01)

Тема: AHK: Blind

Я тут нашёл один код


Хрен с ним

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

2

Re: AHK: Blind

fgslm пишет:

Что здесь не так?

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

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

3

Re: AHK: Blind

teadrinker пишет:
fgslm пишет:

Что здесь не так?

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

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

4 (изменено: fgslm, 2020-07-22 22:46:28)

Re: AHK: Blind

А хех https://www.autohotkey.com/boards/viewtopic.php?t=42712
Вот он
Надеюсь не сочтут за рекламу другого ресурса...
Вобщем кажется что-то не то с командой Blind, потому что другие нажатия(Без модификаторов) работают нормально, зажимаешь Alt - зажимается и Ctrl

5

Re: AHK: Blind

Если это для игры, тогда в соответствующем топике пишите, там своя специфика.

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

6 (изменено: fgslm, 2020-07-22 23:24:38)

Re: AHK: Blind

teadrinker пишет:

Если это для игры, тогда в соответствующем топике пишите, там своя специфика.

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

Alt1 := GetKeyState("Alt", "P")
while 1 == 1
if Alt1
break
else
{
...
}
return

То это не помогает, и цикл всё-равно продолжается.

может так:

Alt1 := GetKeyState("Alt", "P")
while 1 == 1
if not Alt1
{
...
}
else
break
return

Нет...

Или

Alt1 := GetKeyState("Alt", "P")
while 1 == 1

{
if not Alt1
continue
...

else
break
}
return

Тоже нет...

7

Re: AHK: Blind

Честно, я мало что понял.

fgslm пишет:
while 1 == 1

Так вообще не пишут. Если нужен бесконечный цикл, используйте Loop.

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

8 (изменено: fgslm, 2020-07-23 23:44:09)

Re: AHK: Blind

teadrinker пишет:

ый цикл, используйте Loop.

Да я с Lua это почерпнул, там это в порядке вещей. Почему-то в данном примере Loop с прерываниями из цикла вообще не работает, поэтому перешёл по привычке на while.
-
Но честно говоря, из справки я мало понял разницу между while и loop с той лишь разницей условия для цикла указываются,

9

Re: AHK: Blind

Если нужен бесконечный, или условие указывается в теле цикла, тогда Loop.

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

10 (изменено: fgslm, 2020-07-22 23:48:00)

Re: AHK: Blind

Учту. Но всё же вопрос остаётся актуальным:
0. Как прервать цикл нажатием модификатора?

Alt1 := GetKeyState("Alt", "P")
loop

{
if Alt1
break
else
...

}
return

1. Еще во многих скриптах встречаю записи
Send, {...}
SendInput, {...}
и
Send {...}
SendInput {...}

в чём разница меджду написанием с запятой и без нее? Написал "без" - разницы не увидел, но склоняюсь: Чем меньше символов, тем быстрее код.

2. Также при указании некоторых клавиш в нажатии типа f1-9
SendInput, {f6} заметил что подсветка синтаксиса внутри скобок выдаёт её как зарезервированную команду. Может в том дело ошибок?
Как её правильно записывать?

11

Re: AHK: Blind

fgslm пишет:

Как прервать цикл нажатием модификатора?

Если в цикле много действий, то нет другого способа, кроме как проверять статус клавиши после каждого действия:

Loop {
   ToolTip a
   Sleep, 300
   if GetKeyState("Alt", "P")
      break
   ToolTip b
   Sleep 300
   if GetKeyState("Alt", "P")
      break
   ToolTip c
   Sleep, 300
   if GetKeyState("Alt", "P")
      break
}
fgslm пишет:

в чём разница меджду написанием с запятой и без нее?

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

fgslm пишет:

заметил что подсветка синтаксиса внутри скобок выдаёт её как зарезервированную команду. Может в том дело ошибок?

Не понял вопроса. Что за подсветка синтаксиса?

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

12

Re: AHK: Blind

teadrinker пишет:

Не понял вопроса. Что за подсветка синтаксиса?

Обычные переменные обозначаются черным, эти же - зеленым

13

Re: AHK: Blind

teadrinker пишет:

кроме как проверять статус клавиши после каждого действия:

Это не будет слишком сложно для кода вплоть до того что он может зависнуть?

14

Re: AHK: Blind

Зависнуть из-за этого не должен.
Подсветка синтаксиса в редакторе ни на что не влияет, её можно изменить, как нравится.

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

15 (изменено: fgslm, 2020-07-23 14:35:13)

Re: AHK: Blind

teadrinker пишет:

Если в цикле много действий, то нет другого способа, кроме как проверять статус клавиши после каждого действия:

В таком случае цикл не возобновляет свою работу после отпускания модификатора...

16

Re: AHK: Blind

Ну и не должен. Откуда скрипту знать, что вы хотите начать цикл заново после отпускания модификатора?

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

17

Re: AHK: Blind

teadrinker пишет:

Откуда скрипту знать,

Он же бесконечный

18 (изменено: fgslm, 2020-07-23 15:06:00)

Re: AHK: Blind

Мне тут в соседней теме подогнали решения для ожидания отпуска клавиш

KeyWait, %A_ThisHotkey%, U	; Ожидаем отпука текущей клавиши.

Но оно не очень подходит для модификаторов
Возможно что для запуска цикла после прерывания пригодится?

KeyWait, %Alt%, U	; Ожидаем отпука текущей клавиши.

Только откуда скрипту знать что это именно тот хоткей(Alt например), который мне нужен? Не писать же 10 раз KeyWait, %ключ% U, для каждого модификатора?
Что-то для объединения?

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

19

Re: AHK: Blind

KeyWait — правильная идея.

Loop {
   Loop {
      ToolTip a
      Sleep, 300
      if GetKeyState("Alt", "P")
         break
      ToolTip b
      Sleep 300
      if GetKeyState("Alt", "P")
         break
      ToolTip c
      Sleep, 300
      if GetKeyState("Alt", "P")
         break
   }
   KeyWait, Alt
}

В одну переменную никак.

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

20 (изменено: fgslm, 2020-07-23 15:14:45)

Re: AHK: Blind

Короче у меня есть цикл:

loop
{
... что-то там
}
return

И есть функция биндов определенных клавиш

key: a,b,c
BindFunction(Key){
if not if not GetKeyState( key, "P" ){
break
}
SendInput {Blind}{%key%}
sleep 10
}
return
}

Она должна быть главной, и прерывать цикл, но после прекращения использования биндов цикл должен продолжить работу.
Пока что удаётся остановить его, и запустить работу, только в случае обычных хоткеев. А с модификаторами не удаётся - либо он не видит их состояние, либо не продолжает свою работу после отпускания.
- Также не удаётся присвоить единую паузу/Suspend для всего скрипта, чтобы все функции и скрипты прекращали свою работу, но не выходили из скрипта. Либо что-то одно на паузу ставится(цикл или функции биндов), либо залипает одно и на команду не откликается.

21 (изменено: fgslm, 2020-07-23 15:20:15)

Re: AHK: Blind

teadrinker пишет:

Loop { Loop {

А еще у меня тут в соседней теме спрашивали "зачем вам цикл в цикле?"... Видимо потмоу, что без него не обойтись.

22 (изменено: fgslm, 2020-07-23 17:58:03)

Re: AHK: Blind

teadrinker пишет:

В одну переменную никак.

Я говорю о функции
Если её не будет мне надо будет писать

Loop {
   Loop {
      ToolTip a
      Sleep, 300
      if (GetKeyState("Alt", "P") or GetKeyState("Shift", "P") or GetKeyState("Ctrl", "P"))
         break
      ToolTip b
      Sleep 300
      if (GetKeyState("Alt", "P") or GetKeyState("Shift", "P") or GetKeyState("Ctrl", "P"))
         break
      ToolTip c
      Sleep, 300
      if (GetKeyState("Alt", "P") or GetKeyState("Shift", "P") or GetKeyState("Ctrl", "P"))
         break
   }
   KeyWait, Alt
}

Согласитесь это несколько... более громоздкий код?

Я думал о чем-то подобном


loop
{
if ModCheck
break
...
}
return

:Какая-то метка за циклом...

Mod: Alt, Ctrl, Shift
ModCheck(Mod){
loop{
if not GetKeyState("%Mod%", "P"){
break
}
goto: к какой-то метке за циклом
}
return
}

23

Re: AHK: Blind

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

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

24

Re: AHK: Blind

Если уж сильно хочется прерывать цикл через while, то так как-нибудь:

#UseHook

F6::
While !GetKeyState("Alt", "P")
{
ToolTip b
sleep, 2
ToolTip c
sleep, 2
ToolTip p
sleep 2
}
Return

25

Re: AHK: Blind

fgslm

В соседней теме выдал отличный код, что не понравилось?
Прерывать цикл нужно ПРОВЕРКОЙ нажатия клавиши в теле цикла, после каждой итерации либо после важного участка кода. Как до вас это не дойдёт?

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

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

26 (изменено: fgslm, 2020-07-23 22:16:13)

Re: AHK: Blind

__Михаил__ пишет:

fgslm к бессмысленности кода ниже, где переменная не имеет веса так как не будет изменена.

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

teadrinker пишет:

Вы хотите, чтобы можно было прерывать цикл по нажатию любого модификатора

Желательно, чтобы это был любой модификатор вплоть до различия Left/Right + Бинды клавиш. Как я понял без фуннкции Blind тут не обойтись, потому что иначе Совместное нажатие модификаторов с биндами не дублируется.

teadrinker пишет:

но чтобы один код можно было применять для любого из них?

Да впринципе неважно как, главное чтобы это имело приоритет над циклом

27 (изменено: fgslm, 2020-07-23 22:16:06)

Re: AHK: Blind

...

28

Re: AHK: Blind

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

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

29 (изменено: fgslm, 2020-07-23 22:38:42)

Re: AHK: Blind

Ну пока что. Я не планирую захватывать мир... Создавать скайнет, и пр. Так что подойдёт пока что

teadrinker пишет:

любого модификатора

Любого

+ открыть спойлер
teadrinker пишет:

прерывать цикл

Вобще мне идея насилия над циклом не особо импонирует. Слово "прерывать" как то не ассоциируется с полными возможностями такого мощного языка програмирования. Возможно есть решение без прерываний его откладывать/останавливать переводить приоритеты в помещение в более верхние циклы и так далее,  пока работает определённая функция/часть кода?

30

Re: AHK: Blind

Вот так можно по любому указанному в списке:

modifiers := ["Alt", "Shift", "Ctrl"] ; здесь указываете нужные модификаторы
Loop {
   Loop {
      ToolTip a
      Sleep, 300
      if key := GetModifierState(modifiers)
         break
      ToolTip b
      Sleep 300
      if key := GetModifierState(modifiers)
         break
      ToolTip c
      Sleep, 300
      if key := GetModifierState(modifiers)
         break
   }
   KeyWait, % key
}

GetModifierState(arr) {
   for k, v in arr
      if GetKeyState(v, "P")
         Return v
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

31

Re: AHK: Blind

teadrinker пишет:

modifiers := ["Alt", "Shift", "Ctrl"] ; здесь указываете нужные модификаторы Loop { Loop { ToolTip a Sleep, 300 if key := GetModifierState(modifiers) break

Ну вот - Вот! то что я от вас просил!

32 (изменено: fgslm, 2020-07-23 23:03:39)

Re: AHK: Blind

teadrinker пишет:

Loop { Loop {

Но почему-то он у меня не хочет работать с 2-мя циклами.
Там же нужно проверку на нажатие клавиш
А она берется отсюда:

RepeatPressBlind( key ){
loop {
if not GetKeyState( key, "P" ){
break
}
Send, {Blind}{%key%}
sleep 1
}
return
}

И вот теперь диллема - куда поставить эту часть кода, чтобы она не блокировала саму работу цикла. потому что с 2-мя циклами внутренний вообще не работает.
--------------
А что обозначает 

KeyWait, % key

просто непонятно откуда оно взялось, и на что ссылается?

33 (изменено: fgslm, 2020-07-23 23:08:57)

Re: AHK: Blind

teadrinker пишет:

GetModifierState(arr) { for k, v in arr if GetKeyState(v, "P") Return v

Так. Эта функция ссылается на обход бесконечного массива внутри этого цикла
Но у меня то еще проверка нажатия клавиш - которые расположены ЗА этим циклом т.е. если взять примерно
повтор нажатия

RepeatPressBlind( key ){
loop {
if not GetKeyState( key, "P" ){
break
}
SendInput {Blind}{%key%}
sleep 10
}
return
}
sc13::RepeatPressBlind( "sc13" )

То куда его нужно поставить, чтобы функция обхода массива проверки модификаторов охватывала и его тоже?

34 (изменено: fgslm, 2020-07-24 01:18:47)

Re: AHK: Blind

svoboden пишет:

F6:: While !GetKeyState("Alt", "P") { ToolTip b

Ну, если взять

teadrinker пишет:

modifiers := ["Alt", "Shift", "Ctrl"]

teadrinker пишет:

if key := GetModifierState(modifiers) break

и

teadrinker пишет:

GetModifierState(arr) { for k, v in arr if GetKeyState(v, "P") Return v

и прерывать этим. То наверное. Но я пока не знаю как собрать всё это вместе.
Хотя сомневаюсь, Условие запуска цикла по GetKeyState("Numlock", "T") же не работает.

35 (изменено: fgslm, 2020-07-23 23:46:48)

Re: AHK: Blind

__Михаил__ пишет:

после каждой итерации

Щас только подумал. У меня там 50 интераций, если я к каждому добавлю проверку, код станет тяжелее еще на + 50 строк... Хз

Глабальная функция прерывания(111)
Если я нажал там че-то то 
"Цикл астанавись!!!"
end

А потом Условие запуска цикла вообще должно быть
Как

while (пока глобальная функция прерывания не активирована)
{
выпалнять этот код ааа
111
}
выхд
Returnx

36

Re: AHK: Blind

teadrinker пишет:
Loop {
   Loop {
      ToolTip a
      Sleep, 300
      if GetKeyState("Alt", "P")
         break
      ToolTip b
      Sleep 300
      if GetKeyState("Alt", "P")
         break
      ToolTip c
      Sleep, 300
      if GetKeyState("Alt", "P")
         break
   }
   KeyWait, Alt
}

почему
KeyWait, Alt
стоит в конце цикла? Ведь если я нажму модификатор - цикл как минимум 1 раз пройдёт?

37 (изменено: fgslm, 2020-07-25 14:25:31)

Re: AHK: Blind

Вобщем пока сделал такой скрипт:
Но он не работает, и ругается то на else, то на break - не там стоит, не то закрывают, не там скобка, не там ретурн. Черт ногу сломит.

+ открыть спойлер
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#InstallKeybdHook
#InstallMouseHook

check := 0
Loop
if check > 0 
break
else
{ 
toggle := GetKeyState("Capslock", "T")
if toggle = 0
Suspend
	a := 1
	if a >  0 
	{
		Send {1}
        sleep 0
     return ;куда возвращает этот ретурн
    }
    if check > 0 ; после каждого действия проверяеться условие на прерывание цикла
    break
	b := 1
	if b > 0
	{
		Send {2}
        sleep 0
    return
    }
    if check > 0
    break
    c := 1
	if c > 0
	{
		Send {3}
        sleep 0
     return
	}

    if check > 0
    break
}
return

GlobalSuspend(){
loop{
toggle := GetKeyState("Capslock", "T")
toggle2 := GetKeyState("Numlock", "T")
toggle3 := GetKeyState("Scrolllock", "T")
if toggle = 0{
Suspend, On
Pause, On
a := 1
}
if not toggle{
Suspend, Off
Pause, Off
a := 0
break
}
}
}
Critical
global toggle := GetKeyState("Capslock", "T") ;включенность капс
global toggle2 := GetKeyState("Numlock", "T")
global toggle3 := GetKeyState("Scrolllock", "T")
isInUse = 0
RepeatPress( key ){
global isInUse
loop {
if not GetKeyState( key, "P" ){
break
}
if not isInUse  {
SendInput {%key%}
}
sleep 10
}
return
}

RepeatPressBlind( key ){
loop {
if not GetKeyState( key, "P" ){
break
}
SendInput {Blind}{%key%}
sleep 10
}
return
}
RepeatPressRedirect( holdKey, sendKey ){
loop {
if not GetKeyState( holdKey, "P" ){
break
}
SendInput {Blind}{%sendKey%}
sleep 10
}
return
}
*sc2::RepeatPressBlind( "sc2" )
*sc3::RepeatPressBlind( "sc3" )
return

38 (изменено: fgslm, 2020-07-25 16:50:09)

Re: AHK: Blind

teadrinker пишет:

Вот так можно по любому указанному в списке:

modifiers := ["Alt", "Shift", "Ctrl"] ; здесь указываете нужные модификаторы
Loop {
   Loop {
      ToolTip a
      Sleep, 300
      if key := GetModifierState(modifiers)
         break
      ToolTip b
      Sleep 300
      if key := GetModifierState(modifiers)
         break
      ToolTip c
      Sleep, 300
      if key := GetModifierState(modifiers)
         break
   }
   KeyWait, % key
}

GetModifierState(arr) {
   for k, v in arr
      if GetKeyState(v, "P")
         Return v
}

Как расшифровать участок кода начиная от  KeyWait, % key
Key зарезервированная переменная? Или её можно переименовать? У меня ниже есть еще переменные с такми названием.

fgslm пишет:

if key := GetModifierState(modifiers) break

Не возобновляет работу цикла после отпуска модификатора.

39

Re: AHK: Blind

key — переменная, в которой сохраняется то, что возвращает функция GetModifierState(). А возвращает она первую клавишу из списка, статус которой определяется как "нажатая". То-есть, в переменной key находится тот модификатор, который был нажат.

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

40

Re: AHK: Blind

Что мешает в поиске найти: Переменные и выражения.
Вера в то, что всё разжуют?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

41 (изменено: fgslm, 2020-07-25 16:56:37)

Re: AHK: Blind

teadrinker пишет:

key — переменная,

Ну то есть её можно обозначить Kluchik? короче

__Михаил__ пишет:

Вера в то, что всё разжуют?

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

42

Re: AHK: Blind

fgslm пишет:

Ну то есть её можно обозначить Kluchik?

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

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

43

Re: AHK: Blind

fgslm

Почему-то у большинства справки хватает на 80% заполнить знания у вас нет.
Вывод - дело в вас!

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

44

Re: AHK: Blind

__Михаил__ пишет:

Вывод - дело в вас!

Конечно. Кодинг не для меня. Я просто использую его для достижения своих целей.