1

Тема: Переменная внутри цикла

Здраствуйте! Имееться самый простенький скрипт, а точней самый обычный цикл:

Loop
            {
                Send, 6
                Random, t, 125, 350     
                Sleep, t
                Send, 4
                Random, t, 3000, 3300
                Sleep, t
            }

Возможно ли задать клавишу 4 как переменную,  тоесть при нажатии на 1 происходило б поочередное нажатие 1 и 6, если 2, то соответственно 2 и 6, если 3, то 3 и 6 и так далее! И возможно ли создать в данном случае определенный список нужных клавиш, чтоб ток из них шел перебор, а на ненужные клавиши просто б не реагировало!

2

Re: Переменная внутри цикла

Можно... тебе большой пример или маленький?

Описываешь клавиши в массиве и по индексу LOOP их нажимаешь.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 10 x64 Pro(AutoHotkey v1.1.37.02)

3

Re: Переменная внутри цикла

Нужен любой наглядный пример с возможным решением данной задачи! Самому с ноля пока не по силам справиться! Заранее благодарен за помощь!

4

Re: Переменная внутри цикла

Чуть позже напишу, сейчас очень занят.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 10 x64 Pro(AutoHotkey v1.1.37.02)

5

Re: Переменная внутри цикла

Центурион пишет:

Нужен любой наглядный пример с возможным решением данной задачи! Самому с ноля пока не по силам справиться! Заранее благодарен за помощь!

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

1. Из скрипта для упрощения убраны определители HotKey (включение и выключение)
2. Отсутствует работа с таймерами и многопоточностью.
3. Скрипт не тестировался, а его объёмность это множество комментариев.

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

По всем вопросам пиши отвечу исправлю поправлю

;-----Инициализация
; Скрипт не выгружается
#Persistent
; Запрет повторного запуска
#SingleInstance
; Точка выхода, смотри описание по AHK
OnExit, lExample

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Данный вариант должен удволитворить все требования по вызову чего угодно.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cNone     := ""           ; false? нет это true! Определитель конца массива, что бы не писать индексы.
cNoLbL    := "lNonempty"  ; блокиратор метки, т.е. метка которая есть, но она ничего не делает
cSps      := " "          ; Обычный пробел - для удобства.

; Не нужный фрагмент скрипта - дань моей привычке
;----------------------------------------------------
i         := 0            ; Индекс в массиве (не нужно)
MaxAr     := i            ; Максимальное значение массива (не нужно)
MaxArSize := 4            ; Число записей в одном элементе массива (не нужно)
;------------------------------------------------------

; Индексы внутри массива (естественно их может быть больше)
; НО!!! iText всегда должен быть последним, 
; так как этот индекс определяет последовательность клавиш, а так же служит указателем конца массива
iKeys       := 1  ; Базовая клавиша, индекс или что то ещё, но не (=cNone) иначе пропуск
iLabels     := 2  ; Метка обработки клавиши или что то ещё
iSupply     := 3  ; Резерв - можно текст или что угодно.
iText       := 4  ; Последовательность посылки, если он пуст, т.е. начинается с (=cNone) то конец обработки


;----------------------Формат для одного элемента массива
; [ 
; ,cNone(Базовая клавиша или что то ещё) 
; ,cNone(Резерв для вызова подпрограммы)
; ,cNone(Резерв) - можно текст или что угодно.
; ,cNone(Начало последовательности клавиш) - Запись через "," последний элемент должен быть (=cNone) ВСЕГДА!!!
; ] 

; И так описываем то что нужно (пример записи)
arMain := [[cNone,cNone,cNone,cSps] ; Если 4-й элемент cNone то конец массива, т.к. cNone не может быть клавишей. 
          ,["5",cNoLbL ,"Hello Wold!" ,"1","8","9",cNone]  
          ,[cNone ,cNoLbL ,"Это не сработает, т.к. конец массива" ,cNone]]
;----------------------

; Описание закончено, программа резидентна, а её вызов можно сделать или по клавише или иным способом.
; Первый вызов мы всё же сделаем
fFirstEntry := True
Gosub lReparMain
fFirstEntry := !fFirstEntry          
Return
          
;---->>>> Точка первичного/повторного обработки массива.
lReparMain:
i := 1
while (!arMain[i,iText] = cNone) ; Выполнять пока arMainKey[i,iText] != cNone
  {
    
    vKeysFirst := arMain[i,iKeys]        ; Сохраняем клавишу или что там написано, проверку не делаю.
    if (!IsLabel(arMainKey[i, iLabels]))
        {
          ; Тут обработка если метки нет
          ; Выход через метку lExample
          ; C диагностикой, что бы знать в чём ошибка
        }
      else
        {
          vKeysLabel := arMainKey[i, iLabels]  ; Сохраняем метку 
        }
    
    if ((arMain[i,iSupply]) = cNone))
        {
          ; Резерв пуст, можно выдать сообщение и выйти через метку lExample (не обязательно)
          ; Можно просто проигнорировать когда - arMain[i,iSupply]) = cNone
        }
      else
        {
          vSupply := arMain[i,iSupply] ; Сохоаняем резерв, для чего, для общего примера
        }
    
    ; Вызов подпрограммы для заполнения массива вторичных клавиш
    Gosub lSubKeys

    ; Внимание!!!
    ; Метка обхода первого вызова - lFirstEntryCall
    ; Следить за флагом fFirstEntry, если он True(ИСТИНА), то можно проигнорировать запуск, до полной инициализации
    ; А так же проверить правильнось клавиш и меток
    
    ; Тут или в подпрограмме/функции делаем то что нужно.
    ; vKeysFirst - Первичная клавиша или индекс или просто нужное число, т.е. что угодно.
    ; vKeysLabel - Mетка(уже проверенная) для вызова подпрограммы - Gosub %vKeysLabel%
    ; vSupply    - Резерв, может использоваться например как задержка - Delay %vSupply%   
    ; arSubKeys  - Массив вторичных клавиш, как вызывать - ваше дело.
    ; MaxSubKeys - Число вторичных клавиш.
    
; Обработка сл. элемента массива.
lFirstEntryCall:
    i++
  }

; Массив закончился, точка повтора или выхода.
if (fFirstEntry) Return
Goto lReparMain ; И так до бесконечности, причём массив arMain можно заполнять динамически, но соблюдая правила заполнения.

; Подпрограмма заполнения массива вторичных клавиш  
lSubKeys:
    iSubKeys := 1
    j := iText
    while (arMain[i,j] != cNone)
      {
        arSubKeys[iSubKeys] := arMain[i,j]
        iSubKeys++
      }
      MaxSubKeys := iSubKeys
Return  

; Подпрограмма-заглушка  
lNonempty:
return

; Точка выхода
lExample:
; Тут делаем то что хотим сделать перед выходом
; И выходим
ExitApp
      
;---------------------------------------
;Тут пишем что угодно, код, таймеры, функции, подпрограммы, etc.
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 10 x64 Pro(AutoHotkey v1.1.37.02)

6 (изменено: serzh82saratov, 2014-07-07 11:17:39)

Re: Переменная внутри цикла

Центурион - практически рецидив.


#UseHook  

1::
2::
3::
4::
5::
6::
7::
8::
9::
0::     
    SetTimer, LoopSend, Off
    T := 0  
    
LoopSend: 
    SendInput % (T := !T) ? 6 : A_ThisHotkey
    Random, time, T ? 125 : 3000, T ? 350 : 3300
    SetTimer, LoopSend, % "-" time
    Return 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: Переменная внутри цикла

serzh82saratov пишет:

Центурион - практически рецидив.

не понял фразы - ты про что/что имел ввиду?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 10 x64 Pro(AutoHotkey v1.1.37.02)

8

Re: Переменная внутри цикла

Я про то, что товарищ практически сдублировал свою тему.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: Переменная внутри цикла

А... а я то думал что я "накосячил" в скрипте, хотя возможно - я не проверил его.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 10 x64 Pro(AutoHotkey v1.1.37.02)

10

Re: Переменная внутри цикла

Упс)) Прошу прощения, даже в мыслях небыло, но все таки  чуть чуть или практически не считаеться)) Тема похожа, но не идентична! Всем спасибо за предоставленные примеры, теперь будет над чем поработать и заодно свой уровень знаний повысить!