Есть такая игра - Warfaсe. У игры есть процесс Game.exe. Цель - запустить несколько твинков и чтобы они сами циклично нажимали Пробел с паузой в 1000 мс. Казалось бы, с виду - ничего сложного, но есть особенные условия...
Я пробовал экспериментировать с разными вариантами функций Send и ControlSend но до истины не добрался. У меня нет опыта в написании подобных замысловатых AutoIt скриптов (ботов), но благодаря справке и готовым примерам появилось общее представление. Так вот, при использовании Send скрипт работает только с активным окном, которое находится как бы в фокусе (после клика по нему). Если нажать Win+L, соответственно, скрипт сразу теряет связь с игрой. С ControlSend и привязкой по WinGetHandle ситуация немного иная - скрипт работает, даже если окно не в фокусе (неактивно), но игра не видит команду нажатия Пробела так, как она выполняется при простом Send, т.е. в чатах печатаются отступы, а в самой игре нажатия пробела не происходит (персонаж должен нажимать Пробел, чтобы быстрее возрождаться после смерти). Ну и при быстрой смене пользователя по Win+L скрипт тоже перестаёт работать.
Для теста я взял отрывки кода из готовых примеров, т.к. не знал, с чего мне начать. В общем, прошу помощи и совета! В принципе, не откажусь, если тему перенесут в коммерческий раздел, т.к. чувствую, что хитростей и заморочек в моём скрипте будет много. И всё же очень хотелось бы это реализовать, т.к. песочница не работает, а в виртуальных машинах игра просто не запускается, ругаясь на 3D. Остаётся два варианта - либо несколько учёток, либо несколько компьютеров.
P.S. Windows 7 Professional x64, AutoIt 3.3.12.0, SciTE 3.2.5.99, все учётные записи имеют права администратора.
Для тестов использовались следующие отрывки кода:
Игра запускается в несколько окон под разными учётными записями Windows (песочница и виртуальные машины отпадают). Так, вот - нужен правильный скрипт бота-кликера, который будет работать с окном игры под каждой учётной записью Windows отдельно (в фоне). Пример: запускаем учётную запись User1, в ней запускаем игру (Game.exe) и включаем бота. Далее через быструю смену пользователей запускаем следующую учётную запись User2 и, соответственно, следующий клон игры (Game.exe) и так далее (всего 3-4 твинка). Под разными учётными записями пути запуска игры разные (клоны в разных папках). Так вот, необходимо, чтобы бот работал и отправлял команду даже в фоновой (залогиненной, но не активной) учётной записи. Т.е. через быструю смену пользователей мы переходим во вторую учётную запись User2, а чтобы в первой User1 бот продолжал работать и чтобы игра "видела" нажатие пробела, так, как это делает PS2 клавиатура. С программой Clickermann ничего не получилось, т.к. игра не видит нажатия пробела без параметра #ps2_keyborad в скрипте (эмуляция PS2 клавиатуры), а если прописать данный параметр - выполняться он будет только в активной залогиненной учётной записи. Да и выполняется он почему-то везде, в любых окнах и даже в Logon при выборе пользователя, хотя привязан именно к процессу Game.exe. А простую команду нажатия пробела игра рапознаёт только в чатах, т.е. нет прямого выполнения команды персонажем во время игрового процесса. Поэтому вариант с Clickermann отпадает (его можно использовать только в качестве анти-афк). В итоге вся надежда на AutoIt.
Я пробовал экспериментировать с разными вариантами функций Send и ControlSend но до истины не добрался. У меня нет опыта в написании подобных замысловатых AutoIt скриптов (ботов), но благодаря справке и готовым примерам появилось общее представление. Так вот, при использовании Send скрипт работает только с активным окном, которое находится как бы в фокусе (после клика по нему). Если нажать Win+L, соответственно, скрипт сразу теряет связь с игрой. С ControlSend и привязкой по WinGetHandle ситуация немного иная - скрипт работает, даже если окно не в фокусе (неактивно), но игра не видит команду нажатия Пробела так, как она выполняется при простом Send, т.е. в чатах печатаются отступы, а в самой игре нажатия пробела не происходит (персонаж должен нажимать Пробел, чтобы быстрее возрождаться после смерти). Ну и при быстрой смене пользователя по Win+L скрипт тоже перестаёт работать.
Для теста я взял отрывки кода из готовых примеров, т.к. не знал, с чего мне начать. В общем, прошу помощи и совета! В принципе, не откажусь, если тему перенесут в коммерческий раздел, т.к. чувствую, что хитростей и заморочек в моём скрипте будет много. И всё же очень хотелось бы это реализовать, т.к. песочница не работает, а в виртуальных машинах игра просто не запускается, ругаясь на 3D. Остаётся два варианта - либо несколько учёток, либо несколько компьютеров.
P.S. Windows 7 Professional x64, AutoIt 3.3.12.0, SciTE 3.2.5.99, все учётные записи имеют права администратора.
Для тестов использовались следующие отрывки кода:
Код:
HotKeySet("{F7}", "_start")
HotKeySet("{F8}", "_end")
Global $f = 0
While 1
If $f = 1 Then
Send("{SPACE}")
EndIf
Sleep(1000)
WEnd
Func _start()
$f = 1
EndFunc
Func _end()
$f = 0
EndFunc
Код:
HotKeySet('{F7}', '_start')
HotKeySet('{F8}', '_stop')
Global $var = 0
While 1
Func _start()
$var = 0
While $var = 0
ControlSend("Warfaсe", '', '', '{SPACE}')
Sleep(1000)
WEnd
EndFunc
Func _stop()
$var = 1
EndFunc
Код:
HotKeySet('{F7}', '_start')
HotKeySet('{F8}', '_stop')
Global $var = 0
$hWnd = WinGetHandle('Warfaсe')
While 1
Func _start()
$var = 0
While $var = 0
ControlSend($hWnd, '', '', '{SPACE}')
Sleep(1000)
WEnd
EndFunc
Func _stop()
$var = 1
EndFunc