Что нового

[Мышь, клавиатура] Цикличное использование клавиш 1,2,3,4 в окне., кликер

Статус
Закрыто для дальнейших ответов.

Akaboshi

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

Описание:

Заранее приношу свои извинения модератору если он сочтет начало темы не соответствующим её названию.

Прочитайте пожалуйста перед дальнейшим прочтением темы!
Предыстория того как я дошел до ручки и нашел AutoIt:
Периодически, время от времени, когда не работаю я играю в игру под названием World of Warcraft.
Не так давно я нашел в интернете кликер под названием "Фарм Хонора", с подписью AutoIt 3.3.6.1.
Данный файл мне очень понравился своей простотой и тем, что он не является программой взлома,
а просто имитирует действия игрока, а т.е. в окне (как активном, так и нет) нажимает определенные
кнопки с макросами. Но проблема в том что у него нет, ни интерфейса, ни файла конфигураций,
и он формата .exe, т.е. его ни настроить, ни распаковать.
Искал автора но так и не нашел, листал ваш форум в поисках зацепок, не зацепился =(

Описание кликера от неизвестного:
При запущенном окне игры World of Warcraft
(на остальных окнах не пробовал, возможно автор установил в значения стд. название процесса игры)
Запускаем файл "****.exe" созданный в AutoIt.
Появляется иконка в трее, и в левом верхнем углу маленькая полоска с надписью "Нажмите F5" на англ. языке.
Нажимаем F5 и скрипт начинает нажимать кнопки 1,2,3,4 по очереди
Нажимаем F5 и все скрипт спит.

Примечание:
Это очень полезно для меня так как это не влияет на файлы игры,
и окно можно сворачивать, чего нельзя делать с остальными подобными программами.

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

Еще раз о то что должен делать скрипт:
Производить действие нажатия клавиш 1,2,3 и 4 с настраиваемым интервалом времени.
Держаться в трее, было бы круто и игру туда сворачивать отдельной клавишей,
но излишне, я не настолько наглый.
И выполнять все действия исключительно в окне World of Warcraft.
Просто на работе на машинке управляющей стоит WinXP и я не устаю им пользоваться 5 мин в день и там нет проблем. А вот дома есть маленькая проблема, стоит на ноутбуке Win 8 (x64) и
через пару часов сна, единственных и столь редких нажимается "shift" где не поподя и 1,2,3,4
не знаю при чем тут "shift" но он определенно меня хочет довести =)
Вот и все, не так уж много думаю он должен делать.

Заранее спасибо за внимание!
Модератору: использовал Spoiler лишь для минимализации текстового содержания сообщения и упрощения его восприятия!=)
Примечания: Это не бот, просто кликер по кнопкам в определенном окне!
Полезное сообщение на форуме. О трее
 

inx

Знающий
Сообщения
43
Репутация
12
Будет что-то вроде:

Код:
Global $KeyDownDelay = Random (30, 80) ; случайное значение от 30 до 80 миллисекунд (удерживание клавиши в нажатом положении)
Opt("SendKeyDownDelay", $KeyDownDelay) ; удерживание клавиши в нажатом положении $KeyDownDelay миллисекунд
Global $gameclient = "World of Warcraft" ; Имя нужного окна
Global $play = WinExists($gameclient)
Global $paused
Global $time_between_01 = Random (2300, 2400) ; Сколько миллисекунд ждать между нажатиями 4 и 1 кнопок
Global $time_between_02 = Random (2100, 3000) ; Сколько миллисекунд ждать между нажатиями 1 и 2 кнопок
Global $time_between_03 = Random (3000, 3800) ; Сколько миллисекунд ждать между нажатиями 2 и 3 кнопок
Global $time_between_04 = Random (1800, 3200) ; Сколько миллисекунд ждать между нажатиями 3 и 4 кнопок
; Нажимаемые кнопки
Global $Button01 = "1" ; Кнопка 1
Global $Button02 = "2" ; Кнопка 2
Global $Button03 = "3" ; Кнопка 3
Global $Button04 = "4" ; Кнопка 4
; Горячие клавиши
HotKeySet("{F8}", "Quit") ; Хоткей для выхода из скрипта
HotKeySet("{F5}", "Pause") ; Хоткей для паузы

If $play = 0 Then
   MsgBox (16, "Ошибка", "World of Warcraft не запущен")
Else
   WinActivate($gameclient, "") ;
   While 1
	  Pushing()
   WEnd
EndIf
Exit 0

Func Pushing()
		Sleep ($time_between_01)
		ControlSend ( $gameclient, "", "", $Button01)
		Sleep ($time_between_02)
		ControlSend ( $gameclient, "", "", $Button02)
		Sleep ($time_between_03)
		ControlSend ( $gameclient, "", "", $Button03)
		Sleep ($time_between_04)
		ControlSend ( $gameclient, "", "", $Button04)
EndFunc

Func Pause()
    $paused = NOT $paused
    While $paused
        sleep(100)
        ToolTip("Пауза - Нажмите 'F5' для продолжения")
    WEnd
    ToolTip("")
EndFunc

Func Quit()
   $exit = MsgBox(4, "Выход", "Выйти?")
If $exit = 6 Then
Exit
EndIf
EndFunc


А вообще схватить бан дня на три за использование автоматизации в игре можно элементарно, особенно в PvP, где желающих написать тикеты найдется немало.
 
Автор
A

Akaboshi

Новичок
Сообщения
11
Репутация
0
inx
А вообще схватить бан дня на три за использование автоматизации в игре можно элементарно, особенно в PvP, где желающих написать тикеты найдется немало.
да нет, там не так все строго с этим =)) ни кто не заметит если делать грамотно,
на то и нужен тайминг :smile:
Огромное спасибо.

Один только вопрос, почему так ... т.е. про тайминг кнопок именно 4 и 1 и т.д.
Код:
Global $time_between_01 = Random (2300, 2400) ; Сколько миллисекунд ждать между нажатиями 4 и 1 кнопок
Global $time_between_02 = Random (2100, 3000) ; Сколько миллисекунд ждать между нажатиями 1 и 2 кнопок
Global $time_between_03 = Random (3000, 3800) ; Сколько миллисекунд ждать между нажатиями 2 и 3 кнопок
Global $time_between_04 = Random (1800, 3200) ; Сколько миллисекунд ждать между нажатиями 3 и 4 кнопок

не заметил просто где именно =)
 

inx

Знающий
Сообщения
43
Репутация
12
Что почему так?

Global $time_between_01 = Random (2300, 2400)


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

Если нужно точное время между нажатиями, тогда исправить примерно так, вот 2,5 секунды:
Код:
Global $time_between_01 = 2500
 
Автор
A

Akaboshi

Новичок
Сообщения
11
Репутация
0
inx
огромное спасибо! =)

Один последний вопрос по этому коду,
Как @SW_HIDE и @SW_SHOW сюда прикрутить?
т.е. проблема не в том как это сделать, а в том, как сделать это на кнопки
например F6 и F7
 

inx

Знающий
Сообщения
43
Репутация
12
Добавить горячую клавишу:

Код:
HotKeySet("{F9}", "HideShow") ; Хоткей для прятания/извлекания обратно окна


Добавить функцию:

Код:
Func HideShow()
	Local $hWnd = WinGetHandle($gameclient)
	Local $state = WinGetState($gameclient, "")
	If BitAND($state, 2) Then
		WinSetState($hWnd, "", @SW_HIDE)
	Else
		WinSetState($hWnd, "", @SW_SHOW)
	EndIf
EndFunc
 

Mooni

Новичок
Сообщения
2
Репутация
0
Спасибо за решение.. но есть вопрос. Как выбрать окно не по названию, а по процессу?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Mooni
Код:
#Include <Array.au3>
#Include <WinAPIEx.au3>

$iPid = ProcessExists( "explorer.exe" )
If $iPid Then
    $aWins = _WinAPI_EnumProcessWindows( $iPid )
    ; ---
    MsgBox( 64, '', $aWins[1][0] )
    _ArrayDisplay( $aWins )
EndIf
 

Mooni

Новичок
Сообщения
2
Репутация
0
А как его совместить со скриптом выше? :stars:
Задача так же, но только окно выбирается не по названию, а по процессу
 

inx

Знающий
Сообщения
43
Репутация
12
Спасибо за решение.. но есть вопрос. Как выбрать окно не по названию, а по процессу?
Вообще вопрос не по теме, можно было и новую создать..

В скрипте заменить:

Код:
Global $gameclient = "World of Warcraft" ; Имя нужного окна


на

Код:
Global $gameclient = WinGetHandleByExe('wow-64.exe') ; Имя процесса


И где-нибудь ниже добавить что-нибудь такое:

Код:
Func WinGetHandleByExe($Exe)
	Local $aPList = ProcessList($Exe)
	Local $aWList = WinList()
	For $w = 1 To UBound($aWList, 1) - 1
		For $p = 1 To UBound($aPList, 1) - 1
			If WinGetProcess($aWList[$w][1]) = $aPList[$p][1] Then
				If BitAND(WinGetState($aWList[$w][1]), 2) Then Return $aWList[$w][1]
			EndIf
		Next
	Next
EndFunc
 

Григорий37

Новичок
Сообщения
2
Репутация
0
А мне вот то же самое нужно, только в игре Blood and soul? Можно даже одну кнопку, например F3
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Григорий37,
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.
 

Григорий37

Новичок
Сообщения
2
Репутация
0
В том то и дело, что вопрос именно по этой теме, ни шага влево, ни шага вправо :(
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Тема закрыта.
 
Статус
Закрыто для дальнейших ответов.
Верх