Что нового

[Мышь, клавиатура] Простейший макрос

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
$begin = TimerInit()
sleep(3000)
$dif = TimerDiff($begin)
MsgBox(0,"Time Difference",$dif)

Код:
Beep(500, 1000)
 
Автор
S

Sitizen 176

Новичок
Сообщения
25
Репутация
0
Зачем присваивать $begin значение TimerInit и $dif TimerDiff($begin). Почему нельзя обойтись без $begin и $dif?
Потому что иначе программа не поймет это:
Код:
MsgBox(0,"Time Difference",TimerDiff(TimerInit()))

???

Копипаст из справочника:
Код:
$begin = TimerInit()
sleep(3000)
$dif = TimerDiff($begin)
MsgBox(0,"Time Difference",$dif)


Включил скрипт, через 3 секунды он выдал табличку Time Difference, и значение в ней отличное от 3000, что вообще делает TimerInit? В справке написано:
Возвращает значение абстрактного времени в миллисекундах.
Все это заумное предложение - синоним "начало отсчета таймера"?
Судя по описанию TimerDiff, он определяет окончание отсчета таймера, верно?

Как присобачить в скрипте чтоб таймер начал отсчет после отпускания СКМ, потом бибипнул и больше ничего не делал, пока я снова не нажму/отпущу СКМ?
Код:
#include <Misc.au3>

While 1
    If _IsPressed('04') Then
		MouseMove(472, 307)
		Send('9')
		Sleep(5)
		Send('w')
		Sleep(5)
        Send('{SHIFTDOWN}')
		While _IsPressed('04')
			Send('`')
			Sleep(5)
			MouseClick('left')
			Sleep(5)
			send('s')
            Sleep(5)
        WEnd
        Send('{SHIFTUP}')
        Sleep(5)
    EndIf
WEnd
 

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Sitizen 176 [?]
Как присобачить в скрипте чтоб таймер начал отсчет после отпускания СКМ, потом бибипнул и больше ничего не делал, пока я снова не нажму/отпущу СКМ?
Вот, тут таймера нету, но вроде что-то подобное(=
Код:
#include <Misc.au3>
Global $i=0,$p=0,$a
While 1
    If _IsPressed('04') Then
        MouseMove(472, 307)
        Send('9')
        Sleep(5)
        Send('w')
        Sleep(5)
        Send('{SHIFTDOWN}')
        While _IsPressed('04')
			$i += 1
            Send('`')
            Sleep(5)
            MouseClick('left')
            Sleep(5)
            send('s')
            Sleep(5)
			If $i=1600 Then Beep()
        WEnd
        Send('{SHIFTUP}')
        Sleep(5)
		$p=1
	Else
		If $p=1 Then
			While Not _IsPressed('04') And $a<400
				Sleep(100)
				$a+=1
            Wend
			If Not _IsPressed('04') Then Beep()
			$p=1
        EndIf
    EndIf
WEnd

П.С. Не проверял(Т.к. динамики у меня этот бип не воспроизводят(Возможно только если после компиляции)) и не оптимизировал...
 
Автор
S

Sitizen 176

Новичок
Сообщения
25
Репутация
0
Скажи пожалуйста, почему:
Код:
Global $i=0,$p=0,$a ; у $a не стоит значения?
$i += 1 ; ставятся пробелы и зачем плюсик?
If $i=1600 Then Beep() ; почему 1600? $i - это миллисекунды или что? И за счет чего $i сможет дойти от 1 до 1600? Кстати в одной секунде 1000 единиц того, что берется в значении Sleep() и т.д.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Дойти за счет этого: $i += 1
В одной $i - приблизительно 15-20ms
 
Автор
S

Sitizen 176

Новичок
Сообщения
25
Репутация
0
Ок. Почему таймер
Код:
$i += 1
....
...
If $i=1600 Then Beep()
помещен внутрь цикла? По сути он выполняется после окончания цикла, когда кнопка отжимается. Почему именно так? Так же что делает вот это:
Код:
$p=1
    Else
        If $p=1 Then
            While Not _IsPressed('04') And $a<400
                Sleep(100)
                $a+=1
            Wend
            If Not _IsPressed('04') Then Beep()
            $p=1
        EndIf
    EndIf
Если "p"=1, то пока не нажата СКМ и "а"<400, то прибавляется к "а" по единичке, и так до тех пор пока "р" не станет равно 1. Когда СКМ отжимается, звучит бип и "p" становится равным 1, соответственно цикл прекращается. Я правильно понял? "$a" - это просто динамичное число, используемое чтоб цикл создать повторяющийся 400 раз? И как быстро это число будет меняться, раз в 20 миллисекунд?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
$i += 1
....
...
If $i=1600 Then Beep()

Это не таймер, это счетчик. Почему он помещен в таком внутрь цикла я не в курсе, спроси у того кто этот код писал, мб у него есть логическое объяснение. Исходя из текущего кода он тут стоит только лишь для того чтобы известить хозяина о том что цикл прокрутился уже 1600 раз. Если нужная кнопка будет отжата раньше ты не услышишь писка. Если писк ты уже один раз услышал в этой части скрипта то больше ты никогда не услышишь писк до момента физического перезапуска скрипта. Так же если ты не отожмешь кнопку мыши скрипт никогда не покинет эту область кода.

1) После старта скрипта если нажата нужная кнопка происходит ряд манипуляций, далее ряд манипуляций в ограниченном цикле которые имеет конкретное условие выхода которое неизбежно наступает в случае отжатия заданной кнопки и в конце которого $p = 1.

2) После этого цикл начинается заново, если он видит что нужная кнопка не зажата то он запускает вложенную во вторую часть первого If проверку $p = 1. Если он видит что $p = 1 то он запускает вложенный в эту проверку цикл который имеет свой счетчик и четко обозначенное условие выхода при счетчике >= 400 или зажатой заданной кнопке. По окончанию этого цикла если скрипт видит что заданная кнопка не зажата он пищит. В любом случае в конце он приравнивает $p = 1 (Вопрос зачем ведь условием попадания в эту часть скрипта как раз и было $p = 1 и за время нахождения в этой части скрипта $p не изменилось и по окончании все еще = 1. После всех манипуляций цикл начинается сначала.

3) Если будет зажата заданная кнопка скрипт перейдет к части 1), но в этом случае если в прошлый раз он дошел до $i = 1600 он уже ничего не будет ожидать. Для него $i оттикало еще в первый раз и теперь оно для него по дефолту >1600, скрипт не будет больше сигнализировать о чем то в этой части скрипта.

4) $a для скрипта уже >400 и нажмешь ты кнопку или нет скрипт не будет ждать и продолжит выполнение.
Можно еще писать и писать но думаю хватит, это итак никто читать не будет.

Вот коротко и ясно, вердикт: Приведенный выше скрипт не дееспособен и нуждается в доработке.
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Код:
#include <Misc.au3>

$timer = -1

While 1
    If _IsPressed('04') Then
        Send('{SHIFTDOWN}')
        Sleep(50)
        While _IsPressed('04')
            MouseMove(644, 553)
            Sleep(50)
            Send('9')
            Sleep(50)
            MouseClick('left')
            Sleep(50)
        WEnd
        Send('{SHIFTUP}')
		$timer = TimerInit()
    EndIf
	If $timer > 0 And TimerDiff($timer) >= 40000 Then
		Beep(500, 1000)
		$timer = -1
	EndIf
    Sleep(50)
WEnd
 
Автор
S

Sitizen 176

Новичок
Сообщения
25
Репутация
0
Belfigor сказал(а):
Код:
$i += 1
....
...
If $i=1600 Then Beep()

Это не таймер, это счетчик. Почему он помещен в таком внутрь цикла я не в курсе, спроси у того кто этот код писал, мб у него есть логическое объяснение. Исходя из текущего кода он тут стоит только лишь для того чтобы известить хозяина о том что цикл прокрутился уже 1600 раз. Если нужная кнопка будет отжата раньше ты не услышишь писка. Если писк ты уже один раз услышал в этой части скрипта то больше ты никогда не услышишь писк до момента физического перезапуска скрипта. Так же если ты не отожмешь кнопку мыши скрипт никогда не покинет эту область кода.

1) После старта скрипта если нажата нужная кнопка происходит ряд манипуляций, далее ряд манипуляций в ограниченном цикле которые имеет конкретное условие выхода которое неизбежно наступает в случае отжатия заданной кнопки и в конце которого $p = 1.

2) После этого цикл начинается заново, если он видит что нужная кнопка не зажата то он запускает вложенную во вторую часть первого If проверку $p = 1. Если он видит что $p = 1 то он запускает вложенный в эту проверку цикл который имеет свой счетчик и четко обозначенное условие выхода при счетчике >= 400 или зажатой заданной кнопке. По окончанию этого цикла если скрипт видит что заданная кнопка не зажата он пищит. В любом случае в конце он приравнивает $p = 1 (Вопрос зачем ведь условием попадания в эту часть скрипта как раз и было $p = 1 и за время нахождения в этой части скрипта $p не изменилось и по окончании все еще = 1. После всех манипуляций цикл начинается сначала.

3) Если будет зажата заданная кнопка скрипт перейдет к части 1), но в этом случае если в прошлый раз он дошел до $i = 1600 он уже ничего не будет ожидать. Для него $i оттикало еще в первый раз и теперь оно для него по дефолту >1600, скрипт не будет больше сигнализировать о чем то в этой части скрипта.

4) $a для скрипта уже >400 и нажмешь ты кнопку или нет скрипт не будет ждать и продолжит выполнение.
Можно еще писать и писать но думаю хватит, это итак никто читать не будет.

Вот коротко и ясно, вердикт: Приведенный выше скрипт не дееспособен и нуждается в доработке.
Спасибо, прочитал, понял почти все из сказанного. Хотя у меня пока не получится привести в боеспособность скрипт Виктора.
 

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Sitizen 176 [?]
Спасибо, прочитал, понял почти все из сказанного. Хотя у меня пока не получится привести в боеспособность скрипт Виктора.
Да и не нужно, я его на "скорую руку" написал, чуток спешил...
 
Верх