Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: Maza_Faka
Дата сообщения: 17.11.2008 14:21
theHelg
1
_ScreenCapture_Capture()

2
PixelGetColor()
Автор: timsky
Дата сообщения: 17.11.2008 15:21
gal7
Если твои скрипты работают в виде ЕХЕ, то я выкладывал тут свой скриптик, который пишет инфу о следующей исполняемой строке в TraySetToolTip()
Мне так стало намного легче отлавливать ошибки.
Автор: theHelg
Дата сообщения: 17.11.2008 15:44

Цитата:
1
_ScreenCapture_Capture()

2
PixelGetColor()


C первым понятно. Он мне возвращает указатель на Bitmap вот такого типа:
$aResult = DllCall("GDI32.dll", "hwnd", "CreateCompatibleBitmap", "hwnd", $hDC, "int", $iWidth, "int", $iHeight)

Поскольку мне это надо делать в цикле, чтобы было весьма быстро - то без сохранения, а буду брать результат через указатель.

Теперь другой вопрос - как мне по указателю вытащить цвет. PixelGetColor берет данные с экрана (и он меня не устраивает, так как берет цвет точки ПОД курсором мыши в графическом приложении)...

Автор: gal7
Дата сообщения: 17.11.2008 18:49

Цитата:
Мне так стало намного легче отлавливать ошибки.


Так Opt("TrayIconDebug", 1) делает тоже самое? У меня там в основном показывает sleep Мне нужно было немного другое.

Мне нужно сделать изменения размера двух Edit, меняя их взаимный размер линией перетаскивания, но так, как я делал не получается:

Код: #include <GUIConstants.au3>
#Include <GuiRebar.au3>
Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Form1", 633, 454, 193, 115)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$Edit1 = GUICtrlCreateEdit("", 16, 8, 561, 209)
GUICtrlSetData(-1, "Edit1")
$Edit2 = GUICtrlCreateEdit("", 16, 224, 561, 217)
GUICtrlSetData(-1, "Edit2")
GUISetState(@SW_SHOW)
GUICtrlSetResizing(-1, 802);Не менять местоположение созданного элемента
;$hwndRebar = _GUICtrlRebar_Create($Form1)
;_GUICtrlRebar_AddBand($hwndRebar, $Edit1)
;_GUICtrlRebar_AddBand($hwndRebar, $Edit2)

While 1
    Sleep(100)
WEnd

Func Form1Close()
Exit
EndFunc
Автор: NIKZZZZ
Дата сообщения: 17.11.2008 19:57
gal7

Цитата:
У меня есть вопрос-можно ли как-нибудь БЫСТРО выходить из больших функций например при ошибках? Раньше, насколько я понял был goto, но потом его убрали.

GoTo хороший и нужный оператор. Но его реализация слишком неопределенна. Как именно выходить из функции, куда девать стек? По идее стек должен сохраняться, если GoTo выполняется только в теле функции. А если переход осуществляется за ее пределы?
Некоторым аналогом является ExitLoop [level], но к сожалению level должен быть точно указан, хотелось бы иметь ExitLoop [-1].




Автор: asdfzxcv
Дата сообщения: 17.11.2008 20:04
Спасибо Maza_Faka ты мне своим примером (страницы 2е назад) показал как можно адаптировать vbs скрипты на язык автоита и я на второй свой вопрос как получить список компьютеров из домена отвечу сам, вот хочу привести пример скрипта то что у меня получилось я видел такой вопрос у кого-то тоже встречался:

Opt("TrayIconHide", 1)
$hFileWrite = FileOpen(@ScriptDir&"\computer_list.txt", 2) ;открываем лог-файл в который будем сохранять выбранные строки     
Dim $Container ;'as IADsContainer
$ContainerName = inputbox( "Список компьютеров", "Введите имя ДОМЕНА:", "","",10,120 )
$Container = ObjGet("WinNT://" & $ContainerName)

$Container.Filter = _ArrayCreate("Computer")
For $Obj In $Container
    $s=$Obj.Name
    ;WScript.Echo Obj.Name
    ;_ArrayDisplay($s)
    ;MsgBox(416, 'ok', $s)
    FileWriteLine($hFileWrite, $s)
Next
FileClose($hFileWrite)
ShellExecute("computer_list.txt", "", @ScriptDir)

Подскажите , мне непонята одна вещь вот когда я макросом показываю скрипты что нужно скрыть иконку из трея Opt("TrayIconHide", 1) то она при запуске скрипта почиму-то на какие-то доли секунд появляется всё таки и исчезает. Как от этого глюка можно избавится или с этим придётся смерится а то у меня на автоит бльшие планы возложены по резидентной работе в тылу противника
Автор: Inquisition
Дата сообщения: 17.11.2008 21:30
Я щас точно психану! Вот, скрипт функции: http://autoit.pastebin.com/m72def3ad
Для тех кому лень, выложу его сдесь тоже.


Код:
$i = 0 ;Переменная, просто переменная.

Func CombatCheck() ;Функция которая проверяет если бой закончился, если закончился то кликает нужное меню.
    Sleep(3000)
    $CombatCheck = PixelSearch(352, 365, 353, 366, 0x7AB800, 1)
    If IsArray($CombatCheck) Then
    MouseClick("left", 381, 426)
    Sleep(1000)
    MouseClick("left", 511, 455)
    Sleep(300)
    MouseClick("left", 511, 441)
    Sleep(300)
    MouseClick("left", 511, 408)
    Sleep(10000)
    Start()
    EndIf
EndFunc

Func Start() ;Просто для проверки работает ли CombatCheck()
    MsgBox( 0, "Cake", "Pie" )
EndFunc

While 1 ;Ищет пиксель и прибавляет еденицу к i, до тех пор пока он(пиксель) не найдется или пока переменная i не приравнятся 6.
Do
    Sleep(1000)
    $i = $i + 1
    $Upper2 = PixelSearch(328, 377, 329, 378, 0x68181b, 12)
Until IsArray($Upper2) or $i = 6
If IsArray($Upper2) Then
MouseClick("left", $Upper2[0], $Upper2[1] - 1)
    EndIf
    If Not IsArray($Upper2) Then
CombatCheck()
EndIf
Wend
Автор: CrazyNNM
Дата сообщения: 17.11.2008 23:40
Inquisition
попробуй #NoTrayIcon, поможет;)
Автор: timsky
Дата сообщения: 18.11.2008 00:55

Цитата:
Так Opt("TrayIconDebug", 1) делает тоже самое?

Не совсем. Для скомпиленых скриптов она бесполезна.
Автор: ViSiToR
Дата сообщения: 18.11.2008 02:07
Inquisition 22:30 17-11-2008
Цитата:
Я щас точно психану!

И что дальше?


Цитата:
Для тех кому лень

А при чём тут лень?


Цитата:
функция работает тогда и только тогда когда CombatCheck() запускается в первый раз

Я уже написал, что тут играет роль множество факторов, и при чём непредсказуемых факторов. И то что функция запускает сама себя, уже фактор “зацикленности”, т.е происходит первый вход в функцию, а далее постоянный её вызов (ей самой же), таким образом выхода из функции никогда не происходит (или происходит но через долгое время). Другими словами, это не практично.

17:24 15-11-2008
Цитата:
возможно вы сможете скачать ту самую игру для которой я этот бот делаю? В целях проверки скрипты разумеется! Клиент весит всего 2.5 мегабайта

Скачать не проблема, но скажу по правде, у меня нет времени тестировать скрипт на игре, тем более что я не сильный любитель подобных скриптов, да и в игры давно не играл
Автор: Tipulatoid
Дата сообщения: 18.11.2008 05:01
Inquisition
Из статьи в Википедии:

Цитата:
Нередко AutoIt используется для создания ботов к онлайн-играм. Боты позволяют автоматизировать некоторые действия в играх, в результате пользователь может быстрее добиться нужного результата. Такое использование Autoit не одобряется сообществом, поскольку создаёт плохую репутацию программе, однако несколько подобных скриптов могут быть найдены на официальном форуме. Использование ботов рассматривается большинством пользователей AutoIt как нечестная игра, и вам не следует ожидать значительной помощи от сообщества в их создании. Многие члены сообщества вообще не рассматривают такие запросы.
Автор: Inquisition
Дата сообщения: 18.11.2008 08:36

Цитата:
Другими словами, это не практично.


А как практично? По другому не умею =(

Inquisition
Из статьи в Википедии:

Цитата:
Нередко AutoIt используется для создания ботов к онлайн-играм. Боты позволяют автоматизировать некоторые действия в играх, в результате пользователь может быстрее добиться нужного результата. Такое использование Autoit не одобряется сообществом, поскольку создаёт плохую репутацию программе, однако несколько подобных скриптов могут быть найдены на официальном форуме. Использование ботов рассматривается большинством пользователей AutoIt как нечестная игра, и вам не следует ожидать значительной помощи от сообщества в их создании. Многие члены сообщества вообще не рассматривают такие запросы.


Если вы посмотрите сообщение developer'ов на сайте autoit вы поймете, что autoit создавался ИМЕННО для ботов. Также как AcTools.

З.Ы. Статус MVP на форуме получает в том числе и те люди которые создавали мощные боты А по скольку MVP самый (За исключением Developer'a и Admin'a) престижный статус, то можно понять к чему я клоню. (MVP = Monster Vs Person)
Автор: asdfzxcv
Дата сообщения: 18.11.2008 08:48

Полностью согласен ! нехрена ботов писать это низко! Игры с ботами, это действительно как безалкоголоное пиво с резиновой женщиной.

Блин, спасибо CrazyNNM за иконку действительно гробовая тишина в трее )
Автор: ViSiToR
Дата сообщения: 18.11.2008 09:13
Inquisition 09:36 18-11-2008
Цитата:
autoit создавался ИМЕННО для ботов

Нет, он создавался для автоматизации задач в Windows. В справке об этом написано.


Цитата:
Статус MVP на форуме получает в том числе и те люди которые создавали мощные боты

Нет с этим связи. Этот статус получают участники форума которые вносят полезный вклад в AutoIt, помагают другим участникам, и принимают активное участие в развитии проекта.


Цитата:
MVP = Monster Vs Person

Ага, щас. Говорят игромания это тяжёлая болезнь - MVP это Most Valuable Programmer/Person
Кстати, на том же оф. форуме Админы (точнее Jon) заблокировали целый подфорум на тему игр (и правильно сделали), если с Английским нет проблем, то вот интересный топик на эту тему.
Автор: theHelg
Дата сообщения: 18.11.2008 12:18
_ScreenCapture_Capture мне возвращает указатель на картинку.
Как мне теперь можно работать с этой картинкой?
Какие вообще методы работают с графикой? Что я знаю, так это, что эту картинку можно вывести на GUI форму... А как можно еще работать с графикой в AutoITе?

Автор: Loopback
Дата сообщения: 18.11.2008 13:52

Цитата:
_ScreenCapture_Capture мне возвращает указатель на картинку.
Как мне теперь можно работать с этой картинкой?
Какие вообще методы работают с графикой? Что я знаю, так это, что эту картинку можно вывести на GUI форму... А как можно еще работать с графикой в AutoITе?

В принципе, вся сложная работа с графикой производится через UDF GDIPlus.au3 - там куча разных функций.
Правда ничего для получения цвета точки нет, но я нашел такую функцию - GdipBitmapGetPixel, которая делает то что надо.


Код: #include <ScreenCapture.au3>

$x = 10
$y = 40

$hBitmap = _ScreenCapture_Capture()

_GDIPlus_Startup()
; преобразуем HBITMAP в объект, понятный функциям GDI+
$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
; получим цвет пикселя
$aResult = DllCall($ghGDIPDll, "int", "GdipBitmapGetPixel", "ptr", $hImage, "int", $x, "int", $y, "int*", 0)
_GDIPlus_Shutdown()
; удалим объект
_WinAPI_DeleteObject($hBitmap)

MsgBox (0, "Цвет точки " & $x & ":" & $y, Hex($aResult[4], 6))
Автор: theHelg
Дата сообщения: 18.11.2008 14:26

Цитата:
Код:#include <ScreenCapture.au3>

$x = 10
$y = 40

$hBitmap = _ScreenCapture_Capture()

_GDIPlus_Startup()
; преобразуем HBITMAP в объект, понятный функциям GDI+
$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
; получим цвет пикселя
$aResult = DllCall($ghGDIPDll, "int", "GdipBitmapGetPixel", "ptr", $hImage, "int", $x, "int", $y, "int*", 0)
_GDIPlus_Shutdown()
; удалим объект
_WinAPI_DeleteObject($hBitmap)

MsgBox (0, "Цвет точки " & $x & ":" & $y, Hex($aResult[4], 6))


Спасибо!
Дейтсвительно работает!!!
Буду разбираться с документацией!
Автор: asdfzxcv
Дата сообщения: 18.11.2008 16:26
Подскажите , пишу код определие сида пользователя который в данный момент залогинен на компе. Парсом ищу строку с классами что бы определить загруженный профиль. Я не могу понять что мне нужно сделать когда найденный шаблон отображается в массиве но я его не могу отобразить его в MsgBox(4096, "Value Name #", $var2), если я делаю $var2[0] то вообще ошибку выдаёт.... не пойму.

#include <Array.au3>
$comp='имя компьютера'
while 1
    For $i= 1 to 15
$var = RegEnumKey("\\"&$comp&"\HKEY_USERS", $i)
If @error <> 0 then ContinueLoop
$var2 = StringRegExp($var,'S-\d-\d-\d*-\d*-\d*-\d*-\d*_Classes', 1)
;$var2 = StringRegExp("S-1-5-21-842925646-796845957-3458001333-13513_Classes",'S-\d-\d-\d*-\d*-\d*-\d*-\d*_Classes', 1)
    ;if @error <> 1 then ContinueLoop
_ArrayDisplay($var2)

Next
MsgBox(4096, "sid", $var2)
exit
WEnd
Автор: gal7
Дата сообщения: 18.11.2008 17:24
К моменту выхода из цикла там видимо ничего не находит регулярное выражение в $var2, поэтому ошибка если указать как $var2[0]. _ArrayDisplay($var2) показывает массив только если передан массив, а если переменная, то не показывает. А с раскомментированным в примере у меня все работает... (если заменить ContinueLoop на ExitLoop).
Автор: SysLam
Дата сообщения: 19.11.2008 01:44
asdfzxcv


Код: #include <Array.au3>

$aKeys = _RegHKeyLogon()
_ArrayDisplay($aKeys)

Func _RegHKeyLogon($comp = 'CompName')
Local Const $reg = "S-\d-\d-\d+-\d+-\d+-\d+-\d+_Classes"
Local $arr[1]=[0]
For $i=1 to 99
$key = RegEnumKey("\\"& $comp &"\HKEY_USERS", $i)
If @error Then ExitLoop
If
StringRegExp($key, $reg) Then
$arr[0]+=1
ReDim $arr[$arr[0]+1]
$arr[$arr[0]]=$key
EndIf
Next

Return
$arr
EndFunc
Автор: Maza_Faka
Дата сообщения: 19.11.2008 07:37
asdfzxcv
Вариант с использованием WMI:

Код: $strComputer = "."

$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colItems = $objWMIService.ExecQuery("Select * from Win32_UserAccount WHERE Name = '" & @UserName & "'")

For $objItem In $colItems
ConsoleWrite("AccountType: " & $objItem.AccountType & @LF & _
"Caption: " & $objItem.Caption & @LF & _
"Description: " & $objItem.Description & @LF & _
"Disabled: " & $objItem.Disabled & @LF & _
"Domain: " & $objItem.Domain & @LF & _
"FullName: " & $objItem.FullName & @LF & _
"InstallDate: " & $objItem.InstallDate & @LF & _
"LocalAccount: " & $objItem.LocalAccount & @LF & _
"Lockout: " & $objItem.Lockout & @LF & _
"Name: " & $objItem.Name & @LF & _
"PasswordChangeable: " & $objItem.PasswordChangeable & @LF & _
"PasswordExpires: " & $objItem.PasswordExpires & @LF & _
"PasswordRequired: " & $objItem.PasswordRequired & @LF & _
"SID: " & $objItem.SID & @LF & _
"SIDType: " & $objItem.SIDType & @LF & _
"Status: " & $objItem.Status & @LF)
Next
Автор: CrazyNNM
Дата сообщения: 19.11.2008 11:09
народ, подскажите, как в имеющейся строке убрать последние несколько букв
например, имеется имя проги @scriptname и из него надо убрать расширение
или как по другому получить имя проги без расширения??
Автор: asdfzxcv
Дата сообщения: 19.11.2008 12:07
Maza_Faka я wmi пробовал, весь день вчера убил, к зажалению он не выводит сид пользователей на удалённом компьютере может быть потому что они даменные.

CrazyNNM стереть ,erds
вот пример из хелпа
$result = StringTrimRight("I am a string.txt", 3)
MsgBox(0, "String without rightmost 3 characters is:", $result)

gal7 -прикольно действительно работает после exitloop

syslam - сложно с массивами накрутил я в них пока плохо разбираюсь но тоже работает)

Автор: Nikkorot
Дата сообщения: 19.11.2008 13:32
CrazyNNM


Цитата:
народ, подскажите, как в имеющейся строке убрать последние несколько букв
например, имеется имя проги @scriptname и из него надо убрать расширение
или как по другому получить имя проги без расширения??


А разве функции StringLen и StringMind не подходят ?
Автор: CrazyNNM
Дата сообщения: 19.11.2008 16:36
asdfzxcv
то что надо, спасибо большое

Nikkorot
немного не то)) но все равно спасибо
Автор: gal7
Дата сообщения: 19.11.2008 18:26
А так можно удалить расширение регулярным выражением (с любой длиной расширения):

Код: $bez_rashireniya = StringRegExpReplace("fayl.txt", '\.[^\.]+\z', '')
Автор: Nikkorot
Дата сообщения: 19.11.2008 20:23
CrazyNNM

Цитата:
asdfzxcv
то что надо, спасибо большое


А если нужно определить 2,3 или 4 символа ?
Автор: VovanW
Дата сообщения: 19.11.2008 21:16

Цитата:
народ, подскажите, как в имеющейся строке убрать последние несколько букв
например, имеется имя проги @scriptname и из него надо убрать расширение


Есть функция _PathSplit, вроде это делает.
Автор: U235
Дата сообщения: 19.11.2008 22:06
Nikkorot

Цитата:
А если нужно определить 2,3 или 4 символа ?


Код: $bez_konca = StringRegExpReplace("fayl.txt", '\.[^\.]*\z', '')
Автор: CrazyNNM
Дата сообщения: 20.11.2008 00:05
gal7
VovanW
U235
О! тоже гут, спасибо большое))

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.