Quosio
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Bonjour коллеги. Возникли проблемы с двумя скриптами, спрашивал на оффициальном форуме (atutoitscript) но мне так и не ответили. Возможно здесь мне больше повезет В первом скрипте, проблема с "Задержкой" клавиш. Скрипт работает через раз, причем с точностью через раз! Работает,Неработает,Работает,Неработает,Работает .... и.т.д. Дело в том, что иногда задержка между нажатием клавиш ничтожно мала, а иногда велика. Если прописать значение Opt("SendKeyDelay", 0) То будет слишком быстро и скрипт работать вообще не будет. Так как скрипт работает ровно через раз, подозрение именно на ошибку, которую я где-нибудь допустил, а найти не могу. Также меня интересует, как сделать так, чтобы координаты пикселей (в моем случае они хранятса в переменных $x и $y) переводились в соответсвии с разрешением той или иной программы (размер монитора также должен учитыватся). Пока я додумался только до @Desktopwidth и @Desktopheight поделенные на некое число, которое должно дать нужный пиксель. К примеру при разрешении x=1280 я прописывал @DeskTopWidth/10, что равно 128. У меня пиксель находился исправно, а у друзей не работает (У них размер монитора больше). Вот первый скрипт: Код: #include <Misc.au3> #Include <GDIPlus.au3> Global $DaggerArray, $Countset Opt( "SendKeyDelay", 1 ) Opt( "SendKeyDownDelay", 1 ) Opt( "MouseClickDelay", 1 ) Opt( "MouseClickDownDelay", 1 ) opt( "MouseCoordMode", 1 ) $dll = DllOpen("user32.dll") WinActivate( "Warcraft III" ) WinWaitActive( "Warcraft III" ) Global $x = 33 Global $y = 61 Checker() Func Checker() Sleep( 50 ) $DaggerArray = PixelSearch( 834, 668, 834, 668, 0x7126A7 ) If Not IsArray($DaggerArray) Then NoDagger() EndIf If IsArray( $DaggerArray ) Then Dagger() EndIf EndFunc Func Dagger() While 1 Sleep(15) $Meepo2 = PixelSearch(35, 122, 35, 122, 0x0801EC) $Meepo3 = PixelSearch(35, 190, 35, 190, 0x0801EA) $Meepo4 = PixelSearch(33, 260, 33, 260, 0x0701F1) If _IsPressed("14", $dll) And IsArray($Meepo4) Then $Countset = 3 ControlSend( "Warcraft III", "", "", "1" ) $Pos = MouseGetPos() Do ControlSend( "Warcraft III", "", "", "{TAB}" ) ControlSend( "Warcraft III", "", "", "f" ) MouseClick( "Left", $x, $y, 1, 0 ) $Countset = $Countset-1 Until $Countset = 0 ControlSend( "Warcraft III", "", "", "{TAB}" ) MouseMove( $Pos[0], $Pos[1], 0 ) ControlSend( "Warcraft III", "", "", "{NUMPAD7}" ) MouseClick( "Left" ) ControlSend( "Warcraft III", "", "", "f" ) MouseClick( "Left", $x, $y, 1, 0 ) EndIf If _IsPressed("14", $dll) And IsArray($Meepo3) Then $Countset = 2 ControlSend( "Warcraft III", "", "", "1" ) $Pos = MouseGetPos() Do ControlSend( "Warcraft III", "", "", "{TAB}" ) ControlSend( "Warcraft III", "", "", "f" ) MouseClick( "Left", $x, $y, 1, 0 ) $Countset = $Countset-1 Until $Countset = 0 ControlSend( "Warcraft III", "", "", "{TAB}" ) MouseMove( $Pos[0], $Pos[1], 0 ) ControlSend( "Warcraft III", "", "", "{NUMPAD7}" ) MouseClick( "Left" ) ControlSend( "Warcraft III", "", "", "f" ) MouseClick( "Left", $x, $y, 1, 0 ) EndIf If _IsPressed("14", $dll) And IsArray($Meepo2) Then ControlSend( "Warcraft III", "", "", "1" ) $Pos = MouseGetPos() ControlSend( "Warcraft III", "", "", "{TAB}" ) ControlSend( "Warcraft III", "", "", "f" ) MouseClick( "Left", $x, $y, 1, 0 ) MouseMove( $Pos[0], $Pos[1], 0 ) ControlSend( "Warcraft III", "", "", "{TAB}" ) ControlSend( "Warcraft III", "", "", "{NUMPAD7}" ) MouseClick( "Left" ) ControlSend( "Warcraft III", "", "", "f" ) MouseClick( "Left", $x, $y, 1, 0 ) EndIf WEnd EndFunc Func NoDagger() While Not IsArray($DaggerArray) $Meepo2 = PixelSearch(35, 122, 35, 122, 0x0801EC) $Meepo3 = PixelSearch(35, 190, 35, 190, 0x0801EA) $Meepo4 = PixelSearch(33, 260, 33, 260, 0x0701F1) $DaggerArray = PixelSearch( 834, 668, 834, 668, 0x7126A7 ) Sleep(15) If _IsPressed("14", $dll) And IsArray($Meepo4) Then $Countset = 4 ControlSend( "Warcraft III", "", "", "1" ) Do ControlSend( "Warcraft III", "", "", "{TAB}" ) ControlSend( "Warcraft III", "", "", "f" ) MouseClick( "Left", $x, $y, 1, 0 ) $CountSet = $Countset-1 Until $Countset = 0 EndIf If _IsPressed("14", $dll) And IsArray($Meepo3) Then $Countset = 3 ControlSend( "Warcraft III", "", "", "1" ) Do ControlSend( "Warcraft III", "", "", "{TAB}" ) ControlSend( "Warcraft III", "", "", "f" ) MouseClick( "Left", $x, $y, 1, 0 ) $CountSet = $Countset-1 Until $Countset = 0 EndIf If _IsPressed("14", $dll) And IsArray($Meepo2) Then $Countset = 2 ControlSend( "Warcraft III", "", "", "1" ) Do ControlSend( "Warcraft III", "", "", "{TAB}" ) ControlSend( "Warcraft III", "", "", "f" ) MouseClick( "Left", $x, $y, 1, 0 ) $CountSet = $Countset-1 Until $Countset = 0 EndIf WEnd EndFunc Checker() | Со вторым скриптом также беда. Мне нужно нарисовать еллипс через GDI+ в некотором окне. Но почему-то WinGetHandle никогда не находит нужный мне хендл. Я перепробовал кучу окон, от окна аутоита до окна блокнота. Естественно ввожу правильные значения.... Вот к примеру: Код: #include <GuiConstantsEx.au3> #include <GDIPlus.au3> AutoItSetOption("WinTitleMatchMode", 4) _Main() Func _Main() Local $hWnd, $hGraphic $hWnd = WinGetHandle("F:\2.au3 * SciTE4AutoIt3 [2 of 2]") If @error Then MsgBox(4096, "Error", "Could not find the correct window") EndIf _GDIPlus_Startup () $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hWnd) While 1 sleep(50) _GDIPlus_GraphicsDrawEllipse ($hWnd, 130, 100, 200, 200) WEnd EndFunc | Какое бы значение в WinGetHandle я не вводил, всегда он ругается, что найти не может. И последний вопрос который меня интересует... Возможно ли значение пойнтера или адресса с оффсетом (что собственно и есть пойнтер) ввести в переменную аутоит? К примеру пойнтер находится в адрессе 02CCD507, нужно засунуть значение этого пойнтера в переменную $var. Как это сделать? Почти уверен, что в аутоит должна поддерживатся такая возможность, он ведь написан на C++, а в C++ все массивы хранятса в пойнтерах. |