Что нового

[Мышь, клавиатура] Нажатия по команде Send происходят хаотично

volkov1

Новичок
Сообщения
17
Репутация
0
Такая проблема: есть код, при запуске скрипта нажатия в клиенте игры происходят по непонятной схеме, то через одну клавишу нажимает, то только 4, потом только 1 первую, иногда вообще не происходит нажатия. Пробовал несколько раз, системы никакой не наблюдается. По ControlSend нажатия вообще не происходят. Игра Requiem-Online, Ось Вин7 Ultimate. В общем нужен простой кликер-бафальщик.

Код:
inActivate("Requiem")
$press=True ; Разрешение на запуск функции A1()
 
 While True

  If $press Then
   A1() ; Запуск функции A1()
   $press=False ; Запрет запуска функции A1()
   $T1=TimerInit() ; Включение таймера T1
  EndIf
 
 WEnd
 
 If TimerDiff($T1)>1*60*1000 Then $press=True ; Разрешение на запуск функции A1()
  
 Func A1()
  Send("1")
  Sleep(1000)
  Send("2")
  Sleep(1000)
  Send("3")
  Sleep(1000)
  Send("4")
  Sleep(1000)
  Send("5")
 EndFunc
 

axlwor

Скриптер
Сообщения
657
Репутация
147
я бы фиксировал действие. а то винда черти чем занята, может не дать приложению отработать, а ты ему уже следующее посылаешь :laugh:
 
Автор
V

volkov1

Новичок
Сообщения
17
Репутация
0
прошу прощения, что значит зафиксировать? использовать задержку нажатия и отжатия клавиши?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Сделал дело, проверил результат.
Если результат нужный, делай следующее.

Или паузу ставь очень большую, чтобы в любом случае сработало
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
Case $Case1 = "Use Module"
            If $Case2 = "High" Then
                Send("{F"&$Case3&"}")
            ElseIf $Case2 = "Mid" Then
                Send("{ALTDOWN}")
                Sleep(250)
                If _IsPressed("12", $dll) Then 
                    Send("{F"&$Case3&"}")
                EndIf
            ElseIf $Case2 = "Low" Then
                Send("{CTRLDOWN}")
                Sleep(250)
                If _IsPressed("11", $dll) Then 
                    Send("{F"&$Case3&"}")
                EndIf
            Else
                ErrorMSG("Неверный ввод _Then('Use Module'")
            EndIf
            If _IsPressed("12", $dll) Then Send("{ALTUP}")
            If _IsPressed("11", $dll) Then Send("{CTRLUP}")

Как-то так.


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

Или так
Код:
Case $Case1 = "Use Module"
            If $Case2 = "High" Then
                Send("{F"&$Case3&"}")
            ElseIf $Case2 = "Mid" Then
                Do
                    Send("{ALTDOWN}")
                Until _IsPressed("12", $dll)
                Send("{F"&$Case3&"}")
            ElseIf $Case2 = "Low" Then
                Do
                    Send("{CTRLDOWN}")
                    Sleep(250)
                Until _IsPressed("11", $dll)
                Send("{F"&$Case3&"}")
            Else
                ErrorMSG("Неверный ввод _Then('Use Module'")
            EndIf
            If _IsPressed("12", $dll) Then Send("{ALTUP}")
            If _IsPressed("11", $dll) Then Send("{CTRLUP}")

Второй вариант надежнее - но он будет затормаживать скрипт, что в полноценных ботах - нежелательно.
 
Автор
V

volkov1

Новичок
Сообщения
17
Репутация
0
Можно объяснить для тупых, типа меня :smile:
axlwor, ты предлагаешь проверять была ли нажата та или иная клавиша? если да, то пост Belfigor'а как я понимаю, это и есть такая проверка? Теперь пошли тупые вопросы:
- для проверки нажатия надо включать следующий код(элемент, библиотеку или как это правильно называется?...) #include IsPressed? (нужно нижнее подчеркивание перед IsPressed или нет?)
- что это за коды в проверке нажатия ("11", "12" и т.д.), где взять полный список, в мануалах вроде не нашел...
И где можно более подробно почитать про функцию IsPressed?

P.S. сильно не пинайте, второй день только читаю-изучаю AutoIt :smile:
P.P.S. для Belfigor: это кликер, бывают моменты, когда 1-2 часа надо тупо стоять и стрелять, только перебафываться временами, так что скорость работы не критична, даже с 2-5 секундной задержкой проблем не будет.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
После
Код:
Send("1")

что то должно измениться в приложении? Если да, то ждем это изменение (ловим цвет или checksum в нужном месте), после делаем следующее действие. Если это сложно - увеличь sleep

+ send шлет в активное окно - может тут закавыка :-[
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
У меня увы хелп не работает, вбей там в поиске _IsPressed, там вроде "Misc.au3" надо инклудить и подключаться к user32.dll, там в хелпе все написано и набор кодов дан. Моя проверка фиксирует не изменения в клиенте а то зарегистрировала ли система нажатие заданной клавиши или нет (В данном случае Ctrl или Alt)
 
Автор
V

volkov1

Новичок
Сообщения
17
Репутация
0
axlwor сказал(а):
После
Код:
Send("1")

что то должно измениться в приложении? Если да, то ждем это изменение (ловим цвет или checksum в нужном месте), после делаем следующее действие. Если это сложно - увеличь sleep

+ send шлет в активное окно - может тут закавыка :-[

Приложение, как уже говорил, онлайн mmorpg, поэтому трудно что-то отловить...по крайней мере для меня :-[ если только пакеты ловить и дешифровать их, но это уж точно не ко мне :smile: цвет ловить смысла нет, т.к. если хоть какие-то кнопки срабатывают - значит проблема в самом коде (поправьте если я неправ). да и сделать хочу с расчетом на использование не для одного персонажа, поэтому бафы будут разные, следовательно и их цвет.
По поводу окна, при работе скрипта оно активно, значит не в этом соль...Возможно проблема в том, что сам серв подлагивает, может сделать так:
Код:
Send("1 down")
Sleep 1000
Send("1 up")

когда играю, иногда приходится удерживать клавишу, не сразу срабатывает.

to Belfigor спс, поищу. коды клавиш там же должны быть или есть где-то отдельным списком?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Пропробуй напрямую в приложение слать
Код:
$hWnd = WinGetHandle('Requiem')
ControlSend($hWnd, "","", "1")

код написан прямо здесь, ошибки могут быть в каждом знаке
 
Автор
V

volkov1

Новичок
Сообщения
17
Репутация
0
axlwor сказал(а):
Пропробуй напрямую в приложение слать
Код:
$hWnd = WinGetHandle('Requiem')
ControlSend($hWnd, "","", "1")

спс, попробую вечером. Вчера через ControlSend вообще не получалось, но я прописывал целевое окно так
Код:
$hWnd = WinGetHandle("Requiem")
(не ' а " )может из-за этого не происходить нажатие клавиш?
 
Автор
V

volkov1

Новичок
Сообщения
17
Репутация
0
AutoIt Window Info не определяет всего, только показывает, что окно "Requiem", больше никакой информации от клиента добиться не удалось :smile:

Вопрос к модераторам: можно ли переименовать тему(например Автокликер для игры Requiem Online) и задавать вопросы которые касаются всего кода кликера? просто возникают куча мелких вопросов по языку и синтаксису кода скрипта Autoit.

UPD: проблему нажатий решил добавлением опции
Код:
Opt("SendKeyDownDelay", 100)
этого вполне хватило на нормальное срабатывание нажатий. Теперь другая проблема - цикл идет только один раз :wacko: что-то можете посоветовать?
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
volkov1
цикл идет только один раз :wacko: что-то можете посоветовать?

Как то так:
Код:
A1() ; Запуск функции A1
 
 Func A1()
	Send("1")
	Sleep(1000)
	Send("2")
	Sleep(1000)
	Send("3")
	Sleep(1000)
	Send("4")
	Sleep(1000)
	Send("5")	
	$T1=TimerInit() ; Включение таймера T1
	While 1		
		If TimerDiff($T1)>5000 Then 
			A1()
		EndIf
	WEnd
 EndFunc
 
Автор
V

volkov1

Новичок
Сообщения
17
Репутация
0
Yuriy, это то что надо!
Еще помучаю уважаемых пользователей :-[ можно ли использовать цикл в цикле? например так:
Код:
While1
While 1
что-то там...
WEnd
и тут что-то...
Wend

задача стоит (в идеальном варианте) сделать кликер с GUI, чтобы пользователь мог сам задавать через какое время производить ребаф, мог выбрать горячие клавиши, менять настройки и просматривать меню GUI. Насколько я понял GUI пишется с использованием операторов While, WEnd. Такой вариант накидал на Kode и хотелось бы понять в какую сторону дальше думать.
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt("SendKeyDownDelay", 200) ; задержка нажатия клавиш, т.е. клавиша будет удерживаться 0,2 сек
#Region ### START Koda GUI section ### Form=D:\AutoIT\Koda\Test Click!T.kxf
$Form1 = GUICreate("TEST Click!T", 453, 312, 192, 124)
$MenuI1 = GUICtrlCreateMenu("Меню")
$start = GUICtrlCreateMenuItem("Click!T", $MenuI1)
$pause = GUICtrlCreateMenuItem("Пауза", $MenuI1)
$exit = GUICtrlCreateMenuItem("Выход", $MenuI1)
$info = GUICtrlCreateMenu("Инфо")
$help = GUICtrlCreateMenuItem("Помощь", $info)
$about = GUICtrlCreateMenuItem("О программе", $info)
$time1 = GUICtrlCreateLabel("Длительность бафа, сек", 16, 32, 184, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$time2 = GUICtrlCreateLabel("Длительность бафа, сек", 16, 69, 184, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$time3 = GUICtrlCreateLabel("Длительность бафа, сек", 16, 106, 184, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$time4 = GUICtrlCreateLabel("Длительность бафа, сек", 16, 143, 184, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$time5 = GUICtrlCreateLabel("Длительность бафа, сек", 16, 180, 184, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$T1 = GUICtrlCreateInput("", 208, 32, 49, 21)
$T2 = GUICtrlCreateInput("", 208, 69, 49, 21)
$T3 = GUICtrlCreateInput("", 208, 106, 49, 21)
$T4 = GUICtrlCreateInput("", 208, 141, 49, 21)
$T5 = GUICtrlCreateInput("", 208, 180, 49, 21)
$button1 = GUICtrlCreateLabel("Кнопка", 272, 32, 57, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$button2 = GUICtrlCreateLabel("Кнопка", 272, 68, 57, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$button3 = GUICtrlCreateLabel("Кнопка", 272, 105, 57, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$button4 = GUICtrlCreateLabel("Кнопка", 272, 142, 57, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$button5 = GUICtrlCreateLabel("Кнопка", 272, 178, 57, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$K1 = GUICtrlCreateCombo("", 344, 32, 80, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|0|-|=|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NUMPAD0|NUMPAD1|NUMPAD2|NUMPAD3|NUMPAD4|NUMPAD5|NUMPAD6|NUMPAD7|NUMPAD8|NUMPAD9")
$K2 = GUICtrlCreateCombo("", 344, 68, 80, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|0|-|=|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NUMPAD0|NUMPAD1|NUMPAD2|NUMPAD3|NUMPAD4|NUMPAD5|NUMPAD6|NUMPAD7|NUMPAD8|NUMPAD9")
$K3 = GUICtrlCreateCombo("", 344, 103, 80, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|0|-|=|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NUMPAD0|NUMPAD1|NUMPAD2|NUMPAD3|NUMPAD4|NUMPAD5|NUMPAD6|NUMPAD7|NUMPAD8|NUMPAD9")
$K4 = GUICtrlCreateCombo("", 344, 139, 80, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|0|-|=|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NUMPAD0|NUMPAD1|NUMPAD2|NUMPAD3|NUMPAD4|NUMPAD5|NUMPAD6|NUMPAD7|NUMPAD8|NUMPAD9")
$K5 = GUICtrlCreateCombo("", 344, 175, 80, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|0|-|=|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NUMPAD0|NUMPAD1|NUMPAD2|NUMPAD3|NUMPAD4|NUMPAD5|NUMPAD6|NUMPAD7|NUMPAD8|NUMPAD9")
$bStart = GUICtrlCreateButton("Click!T", 42, 232, 97, 25)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$bPause = GUICtrlCreateButton("Пауза", 178, 232, 97, 25)
$bExit = GUICtrlCreateButton("Выход", 314, 232, 97, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
    $nMsg = GUIGetMsg()
    
        If $nMsg = $GUI_EVENT_CLOSE Or $nMsg = $bExit Or $nMsg = $exit Then ExitLoop
WEnd


И последний вопрос: как можно реализовать задание пользователем горячей клавиши? Я представляю себе это так(учитывая, что клавиша присваивается переменной $K)
Код:
Send($K)

верной дорогой иду? :-\
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
volkov1
Можно. Вот еще пример.
Код:
While 1	
	Send("1")
	Sleep(1000)
	Send("2")
	Sleep(1000)
	Send("3")
	Sleep(1000)
	Send("4")
	Sleep(1000)
	Send("5")	
	$T1=TimerInit() ; Включение таймера T1
	While 1		
		If TimerDiff($T1)>5000 Then 
			ExitLoop
		EndIf
	WEnd
WEnd
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Ога, а в переменную можно тупо импортнуть текст из инпута с ГУИ чтобы назначить хоткей. Я свои гуи обрабатываю в While цикле с Select Case структурой.
 
Автор
V

volkov1

Новичок
Сообщения
17
Репутация
0
Belfigor, портнуть через функцию
Код:
GUICtrlRead
? или для этого служит другая команда?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Да да, именно она.


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

Только тебе нужно быть осторожнее при считывании чисел. Там тебе надо будет к считанной информации применять Number.
Код:
$Options[$i][0] = Number(GUICtrlRead($Input2[$i]))

Иначе функции будут беситься и путать числа, и например считать верными следующие выражения: "20" < "10". И обрабатывать их именно ни как численные а как строковые значения.
 
Автор
V

volkov1

Новичок
Сообщения
17
Репутация
0
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt("SendKeyDownDelay", 200) ; задержка нажатия клавиш, т.е. клавиша будет удерживаться 0,2 сек
#Region ### START Koda GUI section ### Form=D:\AutoIT\Koda\Test Click!T.kxf
$Form1 = GUICreate("TEST Click!T", 453, 312, 192, 124)
$MenuI1 = GUICtrlCreateMenu("Меню")
$start = GUICtrlCreateMenuItem("Click!T", $MenuI1)
$pause = GUICtrlCreateMenuItem("Пауза", $MenuI1)
$exit = GUICtrlCreateMenuItem("Выход", $MenuI1)
$info = GUICtrlCreateMenu("Инфо")
$help = GUICtrlCreateMenuItem("Помощь", $info)
$about = GUICtrlCreateMenuItem("О программе", $info)
$time1 = GUICtrlCreateLabel("Длительность бафа, сек", 16, 32, 184, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$time2 = GUICtrlCreateLabel("Длительность бафа, сек", 16, 69, 184, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$time3 = GUICtrlCreateLabel("Длительность бафа, сек", 16, 106, 184, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$time4 = GUICtrlCreateLabel("Длительность бафа, сек", 16, 143, 184, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$time5 = GUICtrlCreateLabel("Длительность бафа, сек", 16, 180, 184, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$T1 = GUICtrlCreateInput("", 208, 32, 49, 21)
$T2 = GUICtrlCreateInput("", 208, 69, 49, 21)
$T3 = GUICtrlCreateInput("", 208, 106, 49, 21)
$T4 = GUICtrlCreateInput("", 208, 141, 49, 21)
$T5 = GUICtrlCreateInput("", 208, 180, 49, 21)
$button1 = GUICtrlCreateLabel("Кнопка", 272, 32, 57, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$button2 = GUICtrlCreateLabel("Кнопка", 272, 68, 57, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$button3 = GUICtrlCreateLabel("Кнопка", 272, 105, 57, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$button4 = GUICtrlCreateLabel("Кнопка", 272, 142, 57, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$button5 = GUICtrlCreateLabel("Кнопка", 272, 178, 57, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$K1 = GUICtrlCreateCombo("", 344, 32, 80, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|0|-|=|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NUMPAD0|NUMPAD1|NUMPAD2|NUMPAD3|NUMPAD4|NUMPAD5|NUMPAD6|NUMPAD7|NUMPAD8|NUMPAD9")
$K2 = GUICtrlCreateCombo("", 344, 68, 80, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|0|-|=|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NUMPAD0|NUMPAD1|NUMPAD2|NUMPAD3|NUMPAD4|NUMPAD5|NUMPAD6|NUMPAD7|NUMPAD8|NUMPAD9")
$K3 = GUICtrlCreateCombo("", 344, 103, 80, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|0|-|=|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NUMPAD0|NUMPAD1|NUMPAD2|NUMPAD3|NUMPAD4|NUMPAD5|NUMPAD6|NUMPAD7|NUMPAD8|NUMPAD9")
$K4 = GUICtrlCreateCombo("", 344, 139, 80, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|0|-|=|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NUMPAD0|NUMPAD1|NUMPAD2|NUMPAD3|NUMPAD4|NUMPAD5|NUMPAD6|NUMPAD7|NUMPAD8|NUMPAD9")
$K5 = GUICtrlCreateCombo("", 344, 175, 80, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "1|2|3|4|5|6|7|8|9|0|-|=|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NUMPAD0|NUMPAD1|NUMPAD2|NUMPAD3|NUMPAD4|NUMPAD5|NUMPAD6|NUMPAD7|NUMPAD8|NUMPAD9")
$bStart = GUICtrlCreateButton("Click!T", 42, 232, 97, 25)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$bPause = GUICtrlCreateButton("Пауза", 178, 232, 97, 25)
$bExit = GUICtrlCreateButton("Выход", 314, 232, 97, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
     Global $key1 = GUICtrlRead($K1), $key2 = GUICtrlRead($K2), $key3 = GUICtrlRead($K3), $key4 = GUICtrlRead($K4), $key5 = GUICtrlRead($K5) ; назначаем горячие клавиши из ComboBox'a
    Global $timer1 = GUICtrlRead($T1), $timer2 = GUICtrlRead($T2), $timer3 = GUICtrlRead($T3), $timer4 = GUICtrlRead($T4), $timer5 = GUICtrlRead($T5) ; объявляем введенные таймеры
    $nMsg = GUIGetMsg()
   
        If $nMsg = $GUI_EVENT_CLOSE Or $nMsg = $bExit Or $nMsg = $exit Then ExitLoop
WEnd


вот таким макаром я делаю, проверял через MsgBox(), не заметил каких-то ошибок.
чтобы наверняка можно делать так:
Код:
$timer1 = Number(GUICtrlRead($T1))
?
У меня так же еще и буквенные значения присутствуют(назначение клавиш), с ними не надо каких-то танцев с бубном?
 
Верх