Что нового

[Lineage II] Цикл перестает выполняться после нескольких проходов.

Gidros

Новичок
Сообщения
10
Репутация
1
Всем привет.
Скажу сразу что autoit я изучаю аж с сегодня, так что не судите строго. ;)
Итак. Есть рабочий скрипт, написанный (и частично украденный :blum:) мною после изучения форума. И все бы хорошо да только он перестает выполняется через небольшой промежуток времени (меньше минуты). Хотя окно не закрывается, не зависает. Прошу знающих людей подсказать где может быть ошибка.
Вот код:
Код:
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
#RequireAdmin
#include <GUIConstants.au3>
GUICreate("Lineage ACP")
GUISetState (@SW_SHOW)

HotKeySet("{F10}", "On")
HotKeySet('{Esc}', '_Exit')


Func On()
   $aa = WinGetHandle('[ACTIVE]')
   While 1
	  ControlSend($aa,'','','{F1}')
	  sleep (5000)
	  ControlSend($aa,'','','{F3}')
   wend
EndFunc

While 1
   $msg = GUIGetMsg()
   If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

Func _Exit()
    Exit
EndFunc


P.S. Пробовал через While, Do и For. Все так же :(

P.S.S. Перестает выполняться вот эта часть кода:
Код:
While 1
	  ControlSend($aa,'','','{F1}')
	  sleep (5000)
	  ControlSend($aa,'','','{F3}')
   wend

Наверно это очевидно, но мало ли.
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
процесс скрипта завершается?
если нет, то скорее перестаёт реагировать окно игры. Вероятно это защита клиента.
 
Автор
G

Gidros

Новичок
Сообщения
10
Репутация
1
Нет, сам процесс не завершается. Он как будто зависает, но работает... Прискорбно если это frost чудит. Самое интересное простейший кликер работает, а вот самопальный самописный - нет. :( Быть может можно как то иначе этот код реализовать? Нет, я не про слом защиты, а про какой нибудь шаманский метод написания того же самого, но с другой реализацией.
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Код:
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
#RequireAdmin
#include <GUIConstants.au3>
Global $aa, $on=0
GUICreate("Lineage ACP")
GUISetState (@SW_SHOW)

HotKeySet("{F10}", "On")
HotKeySet('{Esc}', '_Exit')

While 1
   $msg = GUIGetMsg()
   If $msg = $GUI_EVENT_CLOSE Then Exit
   if $on=1 Then
	   ControlSend($aa,'','','{F1}')
      sleep (5000)
      ControlSend($aa,'','','{F3}')
  EndIf
Wend

Func On()
	if $on=0 Then
		$aa = WinGetHandle('[ACTIVE]')
		$on=1
	Else
		$on=0
	EndIf
EndFunc

Func _Exit()
    Exit
EndFunc
 
Автор
G

Gidros

Новичок
Сообщения
10
Репутация
1
winstan, увы, но тоже самое. Подумал мб проблема в том что меняю окно (ну.. делаю неактивным), ведь там идет проверка... Но все равно тот же эффект. Работает секунд 30 и все. Цикл вроде не останавливается. Ну, не должен.

Да, если в эти 30 секунд сменить окно - то все работает как задумывалось, жаль не долго.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Вот так запусти
Код:
While 1
   if $on=1 Then
      ControlSend($aa,'','','{F1}')
      sleep (5000)
      ControlSend($aa,'','','{F3}')
      sleep (500)    ; я бы ещё вот это добавил, но не знаю что там и как в линейке...
  EndIf
Wend


Избавься от GUIGetMsg
 
Автор
G

Gidros

Новичок
Сообщения
10
Репутация
1
Попробовал добавить в конце цикла sleep и убрать GUI, скрипт вообще перестал работать. Но пока тыкался с этим заметил одну закономерность. Если после запуска скрипта (появляется интерфейс, хоть и пустой ) подождать какое то время (с минуту, мб даже те самые 30 секунд), то после нажатия ф10 ничего происходить не будет, а при переходе на окно скрипта оно подозрительно подвисает, но при нажатие esc исправно закрывается. Мистика... Или frost. Но раз другие кликеры работают без убийства этого самого frost-a значит можно как то сделать. Вопрос только как. :stars:
Вот так не работает вообще. Почему не могу понять. Программа не закрывается но цикл никак не исполнятеся
Код:
HotKeySet("{F10}", "On")
HotKeySet('{Esc}', '_Exit')
$on = 0
While 1
   if $on=1 Then
      ControlSend($aa,'','','{F1}')
      sleep (5000)
      ControlSend($aa,'','','{F3}')
      sleep (500)    
  EndIf
Wend

Func On()
    if $on=0 Then
        $aa = WinGetHandle('[ACTIVE]')
        $on=1
    Else
        $on=0
    EndIf
EndFunc


Func _Exit()
    Exit
EndFunc
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
HotKeySet("{F10}", "On")
HotKeySet('{Esc}', '_Exit')
Global $on = 0
While 1
   if $on=1 Then
      ControlSend($aa,'','','{F1}')
      sleep (5000)
      ControlSend($aa,'','','{F3}')
  EndIf
  sleep (500)  
Wend

Func On()
    if $on=0 Then
        $aa = WinGetHandle('[ACTIVE]')
        $on=1
    Else
        $on=0
    EndIf
EndFunc


Func _Exit()
    Exit
EndFunc


Подправил немного
 
Автор
G

Gidros

Новичок
Сообщения
10
Репутация
1
Увы, не работает. Думаю мб скрипт не правильно выполняется, но как я понял режима отладки у autoit нет. А жаль. Нашел тему где дают пару ссылок на отладчики для autoit, так что пойду потыкаюсь.

Еще нашел на форуме старую темку, там вместо controlsend использовали winapi и sendmessage. Но не могу разобраться как это использовать. В примере дается вот такой код:
Код:
#Include <WinAPI.au3> 
 
$hWnd = WinGetHandle("RF Online") 
_SendMessage($hWnd, 0x6, 0x1) 
ControlSend($hWnd, "", "", "{F1}") 
_SendMessage($hWnd, 0x6, 0x1


как я понял 0x6 это код клавиши... Но ни с одной таблицей которую я смог найти она не совпадает, что то здесь не так. Пробовал подставлять 0x70, но выдает ошибку. Код взял отсюда. Наверно я что то не понимаю. Пните на путь истиный :smile:
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Да не причём тут AutoIt, защиту ковыряй. Frost ставит хуки на окна.
 
Автор
G

Gidros

Новичок
Сообщения
10
Репутация
1
Попробую, конечно. Но ведь аналоги работают. Значит можно сделать. Как то.
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
попробуй использовать
dllcall


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

и попробуй _SendMessage без допалнительных сообщений
Код:
#Include <WinAPI.au3> 
 
$hWnd = WinGetHandle("RF Online") 
_SendMessage($hWnd, 0x70)

и какую ошибку выдаёт?
 
Автор
G

Gidros

Новичок
Сообщения
10
Репутация
1
С ошибкой я что то не то вчера вписал, спать видимо хотел. Вобщем сегодня ее нет ;)
dllcall использовать у меня не получилось, или, что скорее всего, я ее не правильно использую.
Код:
DllCall("user32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
#RequireAdmin
#include <GUIConstants.au3>
#Include <WinAPI.au3>
Global $aa, $on=0
GUICreate("Lineage ACP")
GUISetState (@SW_SHOW)

HotKeySet("{F10}", "On")
HotKeySet('{Esc}', '_Exit')

While 1
   $msg = GUIGetMsg()
   If $msg = $GUI_EVENT_CLOSE Then Exit
   if $on=1 Then
	  _SendMessage($aa, 0x70)
	 ; ControlSend($aa, "", "", "{F1}") 
	  _SendMessage($aa, 0x70)
 
      sleep (5000)
      _SendMessage($aa, 0x72)
	 ; ControlSend($aa, "", "", "{F3}") 
	  _SendMessage($aa, 0x72)
 
	  sleep (500)
  EndIf
Wend

Func On()
    if $on=0 Then
        $aa = WinGetHandle('[ACTIVE]')
        $on=1
    Else
        $on=0
    EndIf
EndFunc

Func _Exit()
    Exit
 EndFunc


Только с DllCall я сооовсем еще не разобрался. Подставил по примеру, и все. Пытаюсь пока иначе реализовать, но потерял тему где изменяли title окна. Вобщем глаза разбегаются от возможностей, а вот "опыта" не хватает... Буду благодарен если кто подправит DllCall, а то я почти уверен что не правильно это. В сети поискал информацию по строке "Wow64DisableWow64FsRedirection" пришел в ужас и решил отложить это... если интересно - вот что нашел


UPD:
Нашел темку где меняли заголовок окна. Вобщем опять проблема. Открыто 2 окна Lineage II. Запускается скрипт:
Код:
WinSetTitle("Lineage II", "", "2 Lineage II")

имя одного окна становится 2 Lineage II, второе остается старым. Запускаю второй раз скрипт - ничего не происходит. В чем может быть проблема?
Кстати окно чей title меняется запущено вторым.

По теме убийства фроста толком ничего не нашел. Нет, нашел, но все старое и 100% не работающее.
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Я предлагал попробовать эмитировать нажатие клавишь через DllCall
Код:
DllCall("user32.dll", "long", "PostMessage", "hwnd", $aa, "int", 0x0100, "int", 0x70,"int", 0)
 
Автор
G

Gidros

Новичок
Сообщения
10
Репутация
1
Нет, через DllCall не получается отправить f1. Но я нашел способ решить свою проблему. Через ControlSend у меня макрос работал секунд 30, и потом зависал. решил проблему тем что сделал 2 макроса. Первый запускает второй макрос и интервалом N а во втором макросе уже действия. Да, не удобно - но работает. Буду шаманить :smile:

Чуть не забыл. В целом вопрос решен, хоть и через... Тему помечу как решенную. Всем спасибо!
 

trizorka

Новичок
Сообщения
53
Репутация
4
У меня тоже была такая проблема, воспользовался Send вместо ControlSend. Помогло.
 
Верх