Что нового

[Автоматизация] Как при использовании 2 одновременно запущенных окон давать команды обоим окнам

bluesword

Новичок
Сообщения
2
Репутация
1
Здравствуйте!

Я полный новичок в AvtoIt. Изучил более-менее примеры. Скрипты работают.

Прошу просто помочь или подсказать каким образом при запуске одновременно 2 окон (dualbox) на 1 компьютере в одном сеансе можно из основного окна управлять персонажем во втором окне. Достаточно кликов через Send ( и связанные с ним команды).

Если данный вопрос уже разбирался, то пожалуйста укажите тему. Два часа рыскал по этому разделу. Пользовался поиском, но видно неправильно ввожу целевые слова.

Заранее спасибо.

P.S. http://autoit-script.ru/index.php/topic,4462.msg32383.html#msg32383 эта тема не то, что требуется. Окна сворачивать не надо.
 

xlgrgrc

Знающий
Сообщения
91
Репутация
7
Хороший вопрос ))) Тоже очень хочу узнать. В свое время тоже пытался но не получилось. Хотел в Lineage мультаакаунтов сделать и бегать сразу 5 персонажами месить. На PVP серверах решает...

Код:
А еще хочу узнать как отправлять команды на другой комп по локальной сети. То есть я нажал заданную кнопку и произошло действие на другом компе. Это по типу клиент сервер как нужно... Отступление от темы.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
xlgrgrc :

Сервер:
Код:
Global $IP = @IPAddress1
Global $PORT = 1000
Global $Listen, $ConnectedSocket, $Data

TCPStartup()

$Listen = TCPListen($IP, $PORT)
If $Listen = -1 Then Exit

While 1
	$ConnectedSocket = -1
	Do
		$ConnectedSocket = TCPAccept($Listen)
	Until $ConnectedSocket <> -1

	While 1
		$Data = TCPRecv($ConnectedSocket, 2048)
		If @error Then ExitLoop
		If $Data <> "" Then MsgBox(0, 'Server', $Data)
	WEnd
WEnd

If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
TCPShutdown()

Клиент:
Код:
Global $Connect, $IP, $Command
Global $Port = 1000

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

$IP = InputBox('Client', 'Введите IP-адрес удалённого ПК:', '', '', 205, 100)
If @error Then Exit

TCPStartup()
$Connect = TCPConnect($IP, $Port)
If $Connect = -1 Then
	MsgBox(48, 'Client', 'Произошла непредвидинная ошибка!' & @CRLF & 'Возможные причины:' & @CRLF & '1) Не правельный IP-адрес' & @CRLF & '2) Не правельно указан порт' & @CRLF & '3) Не запущена программа-серевер на удалённом ПК'  & @CRLF & @CRLF & 'Программа будет закрыта.')
	Exit
Else
	MsgBox(64, 'Client', 'Подключение прошло успешно')
EndIf

While 1
	Sleep(100)
WEnd

Func _Send()
	$Command = InputBox('Client', 'Введите команду', '', '', 200, 100)
	TCPSend($Connect, $Command)
EndFunc

TCPCloseSocket($Connect)
TCPShutdown()
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,600
Репутация
940
Все делается гораздо проще с помощью системы датчиков. Активируется окно, датчики считывают ситуацию и формируют ее в шаблон, например "HP: Normal | MP: Normal | Target: Exists |Atack: In Progress"
Далее эта ситуация обрабатывается с помощью Case или же по уровням раскладывается с помощью If Else ElsIf, окну отдается команда, активируется следующее окно и так далее в цикле. В EVE Online Боты спокойно контролят 15-20 окон. Чем больше датчиков тем дольше процесс определения ситуации => нужно подбирать и формировать датчики так, чтобы не получалось что когда цикл обработки окон находится где-то в середине, а первому окну уже требуется новая команда.
 
Автор
B

bluesword

Новичок
Сообщения
2
Репутация
1
Принцип ясен. То есть нажатием кнопки активируются макросы на всех запущенных окнах.

Но пока, полагаю, с ходу подобные блоки не осилю. Хотя придется). AutoIt отлично обошел все защиты на одном достаточно сильно защищенном сервере.

А есть вариант проще? Для новичков-пусть даже и с геморным алгоритмом.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,600
Репутация
940
Это очень просто вариант,
Одна функция ссылаясь на описанные заранее датчики собирает инфу:
Код:
Func GetLogicState()
    Local $LogicState[6]
    $LogicState[1] = ConCheck("Ship State")
    $LogicState[2] = ConCheck("Cargo Hold")
    $LogicState[3] = ConCheck("Overview")
    $LogicState[4] = ConCheck("Target")
    $LogicState[5] = ConCheck("NPC Tank")
    If $LogicState[3] <> "Asteroid" Then $LogicState[4] = "#" ;Если мы видим в овервью все что угоно кроме астероида то мы тупо возвращаем решотку
    $LogicState[0] = $LogicState[1]&"|"&$LogicState[2]&"|"&$LogicState[3]&"|"&$LogicState[4]

    Return $LogicState
EndFunc


Вторая обрабатывает и принимает решения
Код:
Func II()
    Local $LogicState = GetLogicState()
    Select ;Логика майнера
        #Region - Станция
        Case $LogicState[0] = "Docked|Empty|Nothing Found|#"
;~             TestMSG(121212)
                $WinData[$iWindows[0]][3] = "Андокаюсь"
                _Then("Undock")
            Case $LogicState[0] = "Loading...|Empty|Nothing Found|#"
                $WinData[$iWindows[0]][3] = "Ожидаю выгрузки в козмоз"
            Case $LogicState[0] = "Docked|Full|Nothing Found|#"
                $WinData[$iWindows[0]][3] = "Разгружаю полный трюм"
                _Then("Unload Cargo")
            Case $LogicState[0] = "Docked|Not Empty|Nothing Found|#"
                $WinData[$iWindows[0]][3] = "Разгружаю частично заполненный трюм"
                _Then("Unload Cargo")
        #EndRegion - Станция
        ;====================================================================================
        #Region - Космос
            #Region - У станции
                Case $LogicState[0] = "In Space|Empty|Nothing Found|#"
                    Local $var = ConCheck("Bookmark", "Pos")
                    If Not @error Then
                        $WinData[$iWindows[0]][3] = "Варпаюсь на буку"
;~                         $WinData[$iWindows[0]][3] = "Варпаюсь на буку")
                        _Then("Warp Bookmark", "Within 0m", $var[0], $var[1])
;~                         Sleep(5000)
                    Else
;~                         TestMSG("Не могу найти закладку для варпа")
                        If $CurBelt = False Then $CurBelt = 0
                            $CurBelt = $CurBelt + 1
                            $WinData[$iWindows[0]][2] = $CurBelt
                            _Then("Warp", "Belt", $CurBelt)
;~                             Sleep(5000)
;~                         EndIf
                    EndIf
                Case $LogicState[0] = "In Space|Full|Nothing Found|#" Or $LogicState[0] = "In Space|Not Empty|Nothing Found|#"
                    $WinData[$iWindows[0]][3] = "Лечу на разгрузку не переделывая буки"
;~                     $WinData[$iWindows[0]][3] = "Лечу на разгрузку не переделывая буки")
                    _Then("Warp", "Station", "Dock")
;~                     Sleep(5000)
            #EndRegion - У станции
EndFunc





Добавлено:
Сообщение автоматически объединено:

В цикле While постоянно вызывается функция II, в ней определяется имя текущего окна с которым надо работать, окно активируется, к нему применяется функция GetLogicState, которая комбинациями пиксель серчей и других различных методов собирает инфу об окне, функция II ее обрабатывает и так раз за разом, думаю так будет яснее если с кодом
trolonenene.gif
 
Верх