1 (изменено: Странникх, 2014-07-22 08:47:52)

Тема: AHK: Возврат к метке в коде

~3::
IfWinActive, Name
{
if (lock_3 = 0 && shiftkey = 0 && winkey = 1)
{
lock_3 = 1

PixelSearch,,,  400 , 1070 , 400 , 1070 , 0x1CC3F3, 2, fast    
if ErrorLevel = 1
RE_TRY:
 {                                ; 1 ОТКРЫТИЕ
 PixelSearch,,,  122 , 122 , 122 , 122 , 0x8D8414, 9, fast    
 if (ErrorLevel = 1 || sell != 1)            
 {                                ; OPEN
 if (mustang = 5 && sell = 5)
  {
  SendInput  12
  }
 Gosub RE_TRY
 }                                ; CLOSE                        
 if (ErrorLevel = 0 && sell = 1)            
  {                                 ; 2 ОТКРЫТИЕ
  ;Loop 1
     ;{                            ; 3 ОТКРЫТИЕ
    
    
  ;; MODE    1            
    if (mustang = 5 && mode = 1)                 ;[mode = 1]
    {
        Send 7
        sleep, 20
        Send 7
        sleep, 20
        Send 7
        sleep, 20
        Send 7
    if (GetKeyState("XButton1","P")=0)
        sleep, 1320
    if (GetKeyState("XButton1","P")=0)
        Send 7
        sleep, 150
        Send {vk0x4B}    
    }
  ;; MODE 0
    if (mustang = 5 && mode = 0)                 ;[mode = 0]
    {
        Send 7
        sleep, 20
        Send 7
        sleep, 20
        Send 7
        sleep, 20
        Send 7
        sleep, 20
        Send 7
        sleep, 150
        Send {vk0x4B}    
    }
    ;}                            ; 3 ЗАКРЫТИЕ
  }                                 ; 2 ЗАКРЫТИЕ



 }                                  ; 1 ЗАКРЫТИЕ
}
}
Return

Данный вариант крашит скрипт и компьютер зависает пока полностью не отрубит скрипт.
Я пытаюсь сделать, чтобы после выполнения условий под  (ErrorLevel = 1 || sell != 1) скрипт выполнял условия под (ErrorLevel = 0 && sell = 1), либо как в этом примере видно - после выполнения  (ErrorLevel = 1 || sell != 1)  переходил к метке и уже выполнял (ErrorLevel = 0 && sell = 1).
*Когда скрипт выполняет действия из if (ErrorLevel = 1 || sell != 1) , то ErrorLevel становится равен 0, это по программе так (от пикселя, он меняется после ввода цифр), но, чтобы выполнить действия из ErrorLevel = 0 нужно еще раз нажать кнопку старта (3) так как автоматом скрипт не переходит после действий ErrorLevel = 1 на ErrorLevel = 0.
Нужно, чтобы за одно нажатие 3 код полностью работал, а не за 2 нажатия.

В коде еще встречается if (GetKeyState("XButton1","P")=0). Пытаюсь сделать что-то типа break, чтобы условия дальше не выполнялись если нажал XButton1, но тоже пока безуспешно.


P.S.: Если честно, то всю голову сломал, не понимаю в чем проблема.

2

Re: AHK: Возврат к метке в коде

sell - это же переменная?

3

Re: AHK: Возврат к метке в коде

Да

4

Re: AHK: Возврат к метке в коде

Может дело в том, что не заданна переменная?

P.S. Можете не воспринимать мои сообщения, как подсказки профи - я далеко не профи в ahk

5

Re: AHK: Возврат к метке в коде

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

6 (изменено: Alectric, 2014-07-22 15:06:25)

Re: AHK: Возврат к метке в коде

Попробуйте использовать ограниченный цикл вместо метки.(Цикл ограничен с помощью "break" в конце)

~3::
IfWinActive, Name
{
  if (lock_3 = 0 && shiftkey = 0 && winkey = 1)
  {
    lock_3 = 1

    PixelSearch,,,  400 , 1070 , 400 , 1070 , 0x1CC3F3, 2, fast
    if ErrorLevel = 1
    loop
    {
      PixelSearch,,,  122 , 122 , 122 , 122 , 0x8D8414, 9, fast
      if (ErrorLevel = 1 || sell != 1)
      {
        if (mustang = 5 && sell = 5)
        {
          SendInput  12
        }
        continue
      }
      if (ErrorLevel = 0 && sell = 1)
      {
      ;Loop 1
         ;{


      ;; MODE    1
        if (mustang = 5 && mode = 1)                 ;[mode = 1]
        {
            Send 7
            sleep, 20
            Send 7
            sleep, 20
            Send 7
            sleep, 20
            Send 7
            if (GetKeyState("XButton1","P")=0)
              sleep, 1320
            if (GetKeyState("XButton1","P")=0)
              Send 7
            sleep, 150
            Send {vk0x4B}
        }
      ;; MODE 0
        if (mustang = 5 && mode = 0)                 ;[mode = 0]
        {
            Send 7
            sleep, 20
            Send 7
            sleep, 20
            Send 7
            sleep, 20
            Send 7
            sleep, 20
            Send 7
            sleep, 150
            Send {vk0x4B}
        }
        ;}
      }
      break
    }
  }
}
Return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

7 (изменено: Странникх, 2014-07-22 15:30:17)

Re: AHK: Возврат к метке в коде

Alectric, одно и тоже. С добавлением continue опять крашит.

8 (изменено: Alectric, 2014-07-23 19:30:32)

Re: AHK: Возврат к метке в коде

Что значит "крашит"? Что именно не срабатывает?

Может так имелось в виду:

~3::
IfWinActive, Name
{
  if (lock_3 = 0 && shiftkey = 0 && winkey = 1)
  {
    lock_3 = 1
    PixelSearch,,,  400 , 1070 , 400 , 1070 , 0x1CC3F3, 2, fast
    if ErrorLevel = 1
    {
      loop
      {
        PixelSearch,,,  122 , 122 , 122 , 122 , 0x8D8414, 9, fast
        if (ErrorLevel = 1 || sell != 1)
        {
          if (mustang = 5 && sell = 5)
            SendInput  12
        }
        else if sell = 1
        {
          if (mustang = 5 && mode = 1)                 ;[mode = 1]
          {
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              if (GetKeyState("XButton1","P")=0)
                sleep, 1320
              if (GetKeyState("XButton1","P")=0)
                Send 7
              sleep, 150
              Send {vk4B}
          }
          else if mode = 0                 ;[mode = 0]
          {
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 150
              Send {vk4B}
          }
          break
        }
      }
    }
  }
}
Return

OFF: Дурацкое слово... КрАшит... Словно хлеб на стол крАшит...

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

9

Re: AHK: Возврат к метке в коде

Переписанный Вами мой пример более удобен для восприятия, однако вопроса это не решает. Только ErrorLevel = 0 и некоторые немаловажные переменные опущены у Вас почему-то.
Нужно написать метку перехода после ErrorLevel = 1 на ErrorLevel = 0 или еще раз производить поиск пикселя после выполнения условий ErrorLevel = 1, однако тут возникает какой-то баг, потому что после задания вернуться к метке через GoTo или Gosub скрипт начинает крашиться.
Крашить - он зависает вместе с компьютером. Приходится отключать через диспетчер, либо перезапускать компьютер, потому что курсор невероятно долго двигается.

10 (изменено: Странникх, 2014-07-23 21:51:20)

Re: AHK: Возврат к метке в коде

~3::
IfWinActive, Name
{
  if (lock_3 = 0 && shiftkey = 0 && winkey = 1)
  {
    lock_3 = 1
    PixelSearch,,,  400 , 1070 , 400 , 1070 , 0x1CC3F3, 2, fast
    if ErrorLevel = 1
      Re_try:
      {
        PixelSearch,,,  122 , 122 , 122 , 122 , 0x8D8414, 9, fast
        if (ErrorLevel = 1 || sell != 1)
        {
          if (mustang = 5 && sell = 5)
            SendInput  12
            Gosub Re_try                                       ; После выполнения этого возвращения идет краш
            ; Задача: Здесь должен быть переход к else if (ErrorLevel =  0 && sell = 1)
        }
        else if (ErrorLevel =  0 && sell = 1)
        {
          if (mustang = 5 && mode = 1)                 ;[mode = 1]
          {
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              if (GetKeyState("XButton1","P")=0)
                sleep, 1320
              if (GetKeyState("XButton1","P")=0)
                Send 7
              sleep, 150
              Send {vk4B}
          }
          if (mustang =0 && mode = 0 )                ;[mode = 0]
          {
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 150
              Send {vk4B}
          }
        }
    }
  }
}
Return

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

11

Re: AHK: Возврат к метке в коде

Кстати, только что решил эту проблему альтернативным путем.

~3::
IfWinActive, Name
{
  if (lock_3 = 0 && shiftkey = 0 && winkey = 1)
  {
    lock_3 = 1
    PixelSearch,,,  400 , 1070 , 400 , 1070 , 0x1CC3F3, 2, fast
    if ErrorLevel = 1
      Re_try:
      {
        PixelSearch,,,  122 , 122 , 122 , 122 , 0x8D8414, 9, fast
        if (ErrorLevel = 1 || sell != 1)
        {
          if (mustang = 5 && sell = 5)
            SendInput  12
            SetTimer, Re_try, On
            ; Задача: Здесь должен быть переход к else if (ErrorLevel =  0 && sell = 1)
        }
        else if (ErrorLevel =  0 && sell = 1)
        {
          if (mustang = 5 && mode = 1)                 ;[mode = 1]
          {
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              if (GetKeyState("XButton1","P")=0)
                sleep, 1320
              if (GetKeyState("XButton1","P")=0)
                Send 7
              sleep, 150
              Send {vk4B}
          }
          if (mustang =0 && mode = 0 )                ;[mode = 0]
          {
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 150
              Send {vk4B}
          }
        }
    }
  }
}
Return

Re_try:
PixelSearch,,,  400 , 1070 , 400 , 1070 , 0x1CC3F3, 2, fast
if (ErrorLevel =  0 && sell = 1)
        {
          if (mustang = 5 && mode = 1)                 ;[mode = 1]
          {
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              if (GetKeyState("XButton1","P")=0)
                sleep, 1320
              if (GetKeyState("XButton1","P")=0)
                Send 7
              sleep, 150
              Send {vk4B}
          }
          if (mustang =0 && mode = 0 )                ;[mode = 0]
          {
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 20
              Send 7
              sleep, 150
              Send {vk4B}
          }
        }
SetTimer, Re_try, Off
Return

Скорее всего к крашу приводит ошибка непосредственно в самом AHK, баг в его коде.

12 (изменено: Malcev, 2014-07-24 02:23:20)

Re: AHK: Возврат к метке в коде

Просто GoSub и Goto не может перейти внутрь блока.
У вас не код, а какая-то путанница.
Я бы сделал примерно так:

a = 1
if a = 1
   GoTo, retry 

retry:
msgbox
GoTo, retry

Либо если не хотите выносить retry, то:

PixelSearch,,,  400 , 1070 , 400 , 1070 , 0x1CC3F3, 2, fast
Retry:
if ErrorLevel = 1
   msgbox % ErrorLevel
GoTo retry

13

Re: AHK: Возврат к метке в коде

Второй вариант опять будет помещать GoTo внутрь блока. В первом не понятно зачем после retry снова в нем же делать переход к нему.

14

Re: AHK: Возврат к метке в коде

Второй вариант опять будет помещать GoTo внутрь блока

С чего вы это взяли?
Метка Retry находится не внутри блока, это главное.

В первом не понятно зачем после retry снова в нем же делать переход к нему

Это я как пример привел - метку кинуть в конец.
А там уже сами домыслите.

15

Re: AHK: Возврат к метке в коде

С чего вы это взяли?

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

16 (изменено: Malcev, 2014-07-24 03:24:24)

Re: AHK: Возврат к метке в коде

Получится.
А, не заметил у вас знак "или" в этой строчке.

if (ErrorLevel = 1 || sell != 1)

Поправил код.

PixelSearch,,,  400 , 1070 , 400 , 1070 , 0x1CC3F3, 2, fast
Retry:
if ErrorLevel = 1
{
   PixelSearch,,,  122 , 122 , 122 , 122 , 0x8D8414, 9, fast
   if (ErrorLevel = 1 || sell != 1)
   {
      if (mustang = 5 && sell = 5)
         SendInput  12
      ErrorLevel = 1
      GoSub, Retry
   }
}

17

Re: AHK: Возврат к метке в коде

Нет, там вначале идет еще так:

~3::
IfWinActive, Name
{
  if (lock_3 = 0 && shiftkey = 0 && winkey = 1)
  {
    lock_3 = 1
    PixelSearch,,,  400 , 1070 , 400 , 1070 , 0x1CC3F3, 2, fast
Retry:
if ErrorLevel = 1
{
   PixelSearch,,,  122 , 122 , 122 , 122 , 0x8D8414, 9, fast
   if (ErrorLevel = 1 || sell != 1)
   {
      if (mustang = 5 && sell = 5)
         SendInput  12
      ErrorLevel = 1
      GoSub, Retry
   }
}
}
}
Return

Если ставить "Retry:" даже перед "IfWinActive, Name", то все равно идет краш.

18

Re: AHK: Возврат к метке в коде

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

IfWinNotActive, Name
{
   if !(lock_3 = 0 && shiftkey = 0 && winkey = 1)
   {
      lock_3 = 1
      PixelSearch,,,  400 , 1070 , 400 , 1070 , 0x1CC3F3, 2, fast
      if ErrorLevel = 1
      Retry:
      {
         msgbox
         PixelSearch,,,  122 , 122 , 122 , 122 , 0x8D8414, 9, fast
         if (ErrorLevel = 1 || sell != 1)
         {
            if (mustang = 5 && sell = 5)
               SendInput  12
            GoTo, Retry
         }
      }
   }
}
Return

19

Re: AHK: Возврат к метке в коде

Все равно краш даже так. Ваша версия AHK 1.1.15.00 ?

20

Re: AHK: Возврат к метке в коде

Да.