Что нового

[Мышь, клавиатура] Циклическое нажатие нужной клавиши с задаваемым интервалом в определенном окне

nightfmare

Новичок
Сообщения
3
Репутация
0
Версия AutoIt: 3.3.8.1

Описание:

Доброго всем времени суток! После целого дня безуспешных поисков решения своей проблемы я решился обратиться за помощью к Вам. Уверен, для некоторых это дело десяти минут. Надеюсь на их помощь.
Сам я далеко не программист, по-этому изложу как смогу: Возникла необходимость найти/создать макрос, который будет нажимать одну/две/три клавиши с заданными для каждой из них интервалами в определенном окне. Количество повторений - бесконечно. Диапазон нажимаемых клавиш: F1-F10, 1-10, пробел.
В идеале хочется чтобы:
Была возможность запуска/остановки макроса на горячие клавиши. Какие неважно.
Макрос мог работать при свернутом окне или в окне неактивного пользователя системы.

Изначально был вот такой код, но что-то с ним не так, сам разобраться не смог.
Код:
$hwnds = ControlGetHandle('ACTIVE', '', '')
While 1 == 1
    sendkey($hwnds,0x40);ид клавиши
    Sleep(3000);нужная задержка
WEnd

Func sendkey($hwnd,$key)
DllCall("user32.dll", "long", "PostMessage", "hwnd", $hwnd, "int", 0x0100, "int", $key,"int", 0)
EndFunc

Есть возможность переписать этот или, может, проще создать новый?

Буду премного благодарен своему спасителю!!!

Примечания:

Windows 7 x64
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Re: [Мышь, клавиатура] Циклическое нажатие нужной клавиши с задаваемым интервалом в определенном ок

Подойдет ?
Код:
#AutoIt3Wrapper_Run_Tidy=y

Opt('WinTitleMatchMode', 2)

HotKeySet('{ESC}', '_ProExit')
HotKeySet('`', '_Pause')
Local $aKey_F[11] = ['', '{F1}', '{F2}', '{F3}', '{F4}', '{F5}', '{F6}', '{F7}', '{F8}', '{F9}', '{F10}']
Local $aKey_N[11] = ['', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
Local $j, $Pause = 0

Run("C:\Program Files\AkelPad\AkelPad.exe")

Sleep(500)

While 1
	If $Pause <> 0 Then

		ControlSend("[REGEXPTITLE:AkelPad]", '', '[CLASS:AkelEditW]', $aKey_F[$j])
		Sleep(300)
		ControlSend("[REGEXPTITLE:AkelPad]", '', '[CLASS:AkelEditW]', $aKey_N[$j])
		Sleep(300)
		ControlSend("[REGEXPTITLE:AkelPad]", '', '[CLASS:AkelEditW]', '{SPACE}')
		Sleep(300)

		$j += 1

		If $j = 11 Then
			$j = 1
		EndIf
	Else
		Sleep(100)
	EndIf
WEnd

Func _Pause()
	If $Pause = 0 Then
		$Pause = 1
	Else
		$Pause = 0
	EndIf
	Return
EndFunc   ;==>_Pause

Func _ProExit()
	Exit
EndFunc   ;==>_ProExit
 
Автор
N

nightfmare

Новичок
Сообщения
3
Репутация
0
Re: [Мышь, клавиатура] Циклическое нажатие нужной клавиши с задаваемым интервалом в определенном ок

Уважаемый, ivastel! Очень рад, что так оперативно откликнулись. Огромное вам спасибо за помощь! Почти получилось! Но, видимо, я не совсем конкретно поставил задачу. Попробую ещё раз. :smile: Конкретнее: Нужно чтобы макрос нажимал пробел 10 раз в секунду и параллельно нажимал единичку раз в шесть секунд. Не нужно чтобы макрос принудительно сворачивал окно, просто хотелось чтобы он не сбивался при сворачивании. Как запускать скрипт через хоткей я не понял. Понял, что вырубает его эскейпом.
Вот как я отредактировал.

Код:
#AutoIt3Wrapper_Run_Tidy=y

HotKeySet('{ESC}', '_ProExit')

Local $i
Local $aKey_N[1] = ['{1}']

For $i = 1 To 5
    If WinExists("[class:AkelPad4]") Then
        WinActivate("[class:AkelPad4]")
        ExitLoop
    ElseIf $i = 5 Then
        Exit
    EndIf
Next

While 1
    If WinExists('[class:AkelPad4]') Then
                          ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{SPACE}')
            Sleep(100)
			  ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{SPACE}')
            Sleep(100)
			  ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{SPACE}')
            Sleep(100)
			  ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{SPACE}')
            Sleep(100)
			  ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{SPACE}')
            Sleep(100)
			  ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{SPACE}')
            Sleep(100)
			  ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{SPACE}')
            Sleep(100)
			  ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{SPACE}')
            Sleep(100)
			  ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{SPACE}')
            Sleep(100)
			  ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{SPACE}')
            Sleep(100)
                          ControlSend("[class:AkelPad4]", '', '[CLASS:AkelEditW]','{1}')
            Sleep(100)
    Else
        MsgBox('', '', 'Окно потеряно')
        Exit
    EndIf
WEnd

Func _ProExit()
    Exit
EndFunc   ;==>_ProExit


Работает как надо, но хотелось бы узнать - есть ли возможность поиска окна через имя заголовка? Я, если честно, просто не понимаю что значит "class". Из-за этого не могу настроить макрос на другое окно. И вообще, мне кажется, тут слишком перегруженый макрос выходит. Можно наверно как-то проще сделать =) Просто поиск окна, нажатие одной кнопки и нажатие другой, повтор.
Если будет время и возможность, пожалуйста скажите как добавить возможность паузы и возобновления макроса через хот кей. Чтобы не закрывать полностью и не открывать его заново.
Огромное вам человеческое спасибо!
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Re: [Мышь, клавиатура] Циклическое нажатие нужной клавиши с задаваемым интервалом в определенном ок

Так ? Рассчитано на существующее окно.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

#AutoIt3Wrapper_Run_Tidy=y

Opt('WinTitleMatchMode', 2)

HotKeySet('{ESC}', '_ProExit') ; Выход
HotKeySet('`', '_Pause') ; Пауза скрипта клавиша "тильда"

Local $aKey_F[11] = ['', '{F1}', '{F2}', '{F3}', '{F4}', '{F5}', '{F6}', '{F7}', '{F8}', '{F9}', '{F10}']
Local $aKey_N[11] = ['', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
Local $j, $Pause = 0

#AutoIt3Wrapper_Run_Tidy=y

$sTitle = InputBox("Вопрос", "Заголовок окна") ; Ввод заголовка окна

If $sTitle = '' Then Exit

If Not WinExists($sTitle) Then
	Run("C:\Program Files\AkelPad\AkelPad.exe")
EndIf

Sleep(200)

WinSetState($sTitle, '', @SW_MAXIMIZE)

Sleep(2000)

If Not WinExists($sTitle) Then
	Exit ; Если окна нет то выход
Else
	Sleep(200)
EndIf

Sleep(200)

While 1

	If $Pause <> 0 Then ; Если не пауза то работаем

		ControlSend($sTitle, '', '', $aKey_F[$j])
		Sleep(300)
		ControlSend($sTitle, '', '', $aKey_N[$j])
		Sleep(300)
		ControlSend($sTitle, '', '', ' {SPACE}')
		Sleep(300)

		$j += 1

		If $j = 11 Then
			$j = 1
		EndIf
	Else
		Sleep(100)
	EndIf
WEnd

Func _Pause()
	If $Pause = 0 Then
		$Pause = 1
	Else
		$Pause = 0
	EndIf
	Return
EndFunc   ;==>_Pause

Func _ProExit()
	Exit
EndFunc   ;==>_ProExit
 
Автор
N

nightfmare

Новичок
Сообщения
3
Репутация
0
Re: [Мышь, клавиатура] Циклическое нажатие нужной клавиши с задаваемым интервалом в определенном ок

Фантастика!! Это на 99% то, что я хотел!! Надеюсь, завтра на свежую голову с последним процентом я разберусь самостоятельно.
Особенно круто окошко выбора названия окна =)
Огромное спасибо!!
 
Верх