Показать полную графическую версию : [Архив - Часть 1.2] AutoIt скрипты
XXXler
ну теперь я буду матерится
Не надо :sorry:
Значит смотрется это все будет так:
Приогромнейшее человеческое спасибо - За разъяснения и за примеры! http://smilies.sofrayt.com/fsc/gentleman.gif
это то что и нужно было!
XXXler ты человек смотрю добрый разъесни тогда такую весч.
$var=MyFunc("Заголовок","Сообщение") ну с этим всё понятно, а вот здесь
Case $CmdLine[0] = 0
IniWriteVP(@ScriptDir&"\Test.ini","Test Section","Parametr Test","Value Test",1)
разве не нужно делать через Call(Func).
Может кто подскажет как создать WAN PPPoE соединение (обычно это соединение создающееся для работы через модем) и прописать туда логин пароль. Спасибо
разве не нужно делать через Call(Func).
все встроенные и пользовательские функции можно и нужно вызывать напрямую, Call() же можно использовать для вызовов нескольких функций с подстановкой ее имени (посмотри пример в справке, там же кстати описано ограничение Call() - с ее пом. нельзя передавать функции никаких параметров), кроме того если функция вызванная из Call() отсуствует, компилятор не вылетит с ошибкой.
DenchikK
07-08-2006, 04:14
C хитрым кейгеном столкнулся - идентификации не происходит. Почитал
help - но так и не понял, можно ли из этого положения выйти. Как видно
по картинке AutoIt определяет лишь:
видимый тект:
Digerati и ключ (например HEUBGOKIMFLQRJNSP) в полях Edit1 и Edit2
4 кнопки: Static4, Static3, Static2, Static1
http://img520.imageshack.us/img520/6397/20060807040802rh3.th.jpg (http://img520.imageshack.us/my.php?image=20060807040802rh3.jpg)
Dirk Diggler
07-08-2006, 14:08
я не понял, какой такой идентификации не происходит. Но попробуй еще WinSpy от nnCron, они здорово дополняют друг друга
DenchikK
07-08-2006, 15:39
я не понял, какой такой идентификации не происходит
Грубо говоря, такой функции, как WinWaitActive (и иже с ней), не за что зацепится. В окне в принципе нет ничего в разделах:
>>>>>>>>>>>> Window Details <<<<<<<<<<<<<
Title:
>>>>>>>>>>> Control Under Mouse <<<<<<<<<<<
Text:
Dirk Diggler
07-08-2006, 22:33
Как с пом. Autoit получить SID пользователя или группы? Я сделал функцию обработки файлового вывода от psgetsid.exe, но она слишком медленно работает.
Sanja Alone
08-08-2006, 02:26
DenchikK
идентификации не происходит
Ну, это не проблема :) В подобной ситуации нужно исп-ть 4-й режим определения окон Opt("WinTitleMatchMode",4).
Можно подождать этого окна вот так:
WinWaitActive('')или так:
Do
Sleep ( 200 )
$handle = WinGetHandle ( "classname=#32770" )
Until $handle <> ""
WinActivate ( $handle )
WinWaitActive ( $handle )
P.S. Все это есть в справке по AutoIt. Кстати, именно по этой причине я не включил сией инфы в FAQ.
Процитирую AutoIt.chm:
Mode 4
Advanced mode.
In this mode special sequences are used in the title parameter so that window classnames and handles can be used. The text parameter remains the same.
The special sequences must contain no whitespace. They are:
"classname=CLASSNAME"
"regexp=REGEXP"
"active"
"last" or ""
"classname=" matches a window based on its classname. For example to identify a window that has the classname "MYCLASS1" then you would use "classname=MYCLASS1" for the title parameter.
"regexp=" matches a window matching REGEXP pattern.
"active" matches the currently active window (same as "" in the default WinTitleMatchMode).
"last" uses the last successful window match so you don't have to keep specifying the title and text again and again. e.g.
AutoItSetOption("WinTitleMatchMode", 4)
WinWaitActive("Untitled - Notepad")
WinClose("last") ; Closes the previously matched notepad window
Note: If "classname=", "regexp=", "active", "last" or "" are not used as the title then the window matching takes place as in Mode 1 making this a good mode for general use.
Sanja Alone
08-08-2006, 04:23
Dirk Diggler
Как с пом. Autoit получить SID пользователя или группы? Я сделал функцию обработки файлового вывода от psgetsid.exeСтолкнулся с подобной проблемой при написании скрипта для сохранения/восстановления настроек Outlook Express (нужен был SID текущего пользователя).
Решил похожим методом (т.е. слегка раком :) ), только без посторонних утилит и без обработки потоков с пом. соотв. ф-ций в последних бетах АвтоИт-а (RegRead здесь не катит по причине запрета на чтение требуемой ветки):Func findsid()
Local $file, $sid
RunWait(@ComSpec & ' /c for /F "tokens=5 delims=\" %j in ('&Chr(39)&'reg query "HKEY_CURRENT_USER\Software\Microsoft\Protected Storage System Provider"'&Chr(39)&') do (echo %j> %temp%\sid.tmp)','',@SW_HIDE)
$file = FileOpen(@TempDir&'\sid.tmp',0)
If $file = -1 Then
SetError(1)
Return(0)
EndIf
$sid=FileReadLine($file,1)
FileClose($file)
FileDelete(@TempDir&'\sid.tmp')
Return $sid
EndFuncА вообще, SID-ы пользователей записаны в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList; SID-ы групп - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\GroupMembership и HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy\GroupMembership. Только не понятно, как их сопоставить с названиями групп (за исключением стандартных групп, вроде S-1-1-0 /Все/, S-1-5-544 /Администраторы/, S-1-5-545 /Пользователи/ и т.п.). В справочнике Джерри Хонейкатта по реестру WinXP, к сожалению, подробной инфы по рассматриваемой теме нет. Т.о., использованная тобой утилка Марка Руссиновича является вполне приемлемым ответом на твой же вопрос, если нет желания копать глубже или переписывать эту же утилку на АвтоИт с пом. DllCall-ов, вооружившись знанием WinAPI.
но она слишком медленно работаетИ как это можно исправить, если ты не приводишь код?
Подскажите пожалуйста, можно ли сделать сравнение даты создания (изминения) файла в сети, с другой датой (указанной в скрипте), и если дата создания (изминения) файла, ровняется указанной в скрипте, то пусть появляется меседжбокс, в противном случае, что-то должно делаться. Т.е, допустим в сети, лежит файл, который в последний раз был изменён 25-ого Января, 2006 г. А в скрипте, указать ту же дату для сравнения - 25-го января 2006 г. И если в момент запуска скрипта, файл не был изменён, и дата его изменения ровна указанной в скрипте, то пусть выскакивает меседжбокс, а если файл был изменён (т.е если уже его дата изминения не ровняется указанной), то что-то должно делаться (неважно что :) ).
Если такое возможно, подскажите плиз как это оуществить.
Заранее благодарю за внимание!
Dirk Diggler
08-08-2006, 13:42
И как это можно исправить, если ты не приводишь код? А никак. Надо придумать другой способ. Код вот:
Func GetSid($_Username) ;возвращает сид юзера. имя должно быть полным, все довески(домен, комп) должны быть уже переданы в функкцию
FileDelete(@TempDir & '\getsid.tmp')
Run(@ComSpec & ' /c "' & @ScriptDir & '\psgetsid.exe" ' & $_Username & '> ' & @TempDir & '\getsid.tmp', '', @SW_HIDE)
Sleep(50)
Local $f= FileOpen(@TempDir & '\getsid.tmp',0)
Local $a= FileReadLine($f,2)
FileClose($f)
If StringStripWS ( $a, 8) <> "" Then Return StringStripWS($a, 8)
Return $_Username
EndFunc
Дело в том, что эта функция используется в цикле до 2-3 тыс. раз. И обработка файлового вывода вообще не вариант, цикл будет выполняться годами. Есть вариант вот такой:
Func GetSid($UserName, $Domain)
Dim $UserSID, $oWshNetwork, $oUserAccount
$objWMIService = objGet( "winmgmts:{impersonationLevel=impersonate}!//" & @ComputerName & "/root/cimv2")
$oUserAccounts = $objWMIService.ExecQuery("Select SID from Win32_UserAccount WHERE Name = '" & $UserName & "' AND Domain = '" & $Domain & "'")
For $oUserAccount In $oUserAccounts
Return $oUserAccount.SID
next
EndFunc
Но у него свои недостатки - в функцию надо передавать отдельно имя пользователя и домен. В то время как первая функция умеет конвертировать имена в любом формате, например user@domain.local
AdrenalinE
10-08-2006, 12:40
HotKeySet("{PAUSE}", "Pause")
Global $Paused
While 1
$Click = _FindMonster()
MouseClick('left', $click[0], $click[1], 1, 0)
Attack()
WEnd
Func _FindMonster()
Dim $iCoord
While 1
$iCoord = PixelSearch(250, 225, 374, 274, 0xFF00FF, 25, 1)
If @error <> 1 Then ExitLoop
$iCoord = PixelSearch(375, 225, 474, 274, 0xFF00FF, 25, 1)
If @error <> 1 Then ExitLoop
$iCoord = PixelSearch(415, 275, 474, 359, 0xFF00FF, 25, 1)
If @error <> 1 Then ExitLoop
$iCoord = PixelSearch(375, 360, 474, 399, 0xFF00FF, 25, 1)
If @error <> 1 Then ExitLoop
$iCoord = PixelSearch(250, 225, 374, 399, 0xFF00FF, 25, 1)
If @error <> 1 Then ExitLoop
$iCoord = PixelSearch(250, 175, 474, 224, 0xFF00FF, 25, 1)
If @error <> 1 Then ExitLoop
$iCoord = PixelSearch(475, 175, 574, 399, 0xFF00FF, 25, 1)
If @error <> 1 Then ExitLoop
$iCoord = PixelSearch(0, 400, 424, 474, 0xFF00FF, 25, 1)
If @error <> 1 Then ExitLoop
$iCoord = PixelSearch(0, 175, 259, 399, 0xFF00FF, 25, 1)
If @error <> 1 Then ExitLoop
$iCoord = PixelSearch(0, 100, 664, 174, 0xFF00FF, 25, 1)
If @error <> 1 Then ExitLoop
; The sleep is there to prevent the PixelSearches
; from lagging the script a lot if a monster is not found
; in the first loop
Sleep(250)
WEnd
$iCoord[0] = $iCoord[0] + 4
$iCoord[1] = $iCoord[1] + 4
Return $iCoord
EndFunc ;==>_FindMonster
Func Attack()
While 1
If WinActive("SRO_Client") And PixelGetColor(77, 47) = 3947324 Then;IF ACTIVE AND INGAME
; USE SKILL 1 (mine is sword attack, strike and smash) UNLESS MONSTER IS CLOSE TO DYING
if (PixelGetColor(605, 23) = 14077580 And PixelGetColor(442, 45) = 16762566) Then
Send("2")
Sleep(1000)
EndIf
; USE SKILL 7 (mine is combo sword attack (5hits)) UNLESS MONSTER IS ALMOST DOWN
if (PixelGetColor(605, 23) = 14077580 And PixelGetColor(475, 45) = 16743291) Then
Send("1")
Sleep(1000)
EndIf
; USE IMBUE SKILL (mine is skill 2) UNLESS MONSTER IS ALMOST DOWN
if (PixelGetColor(605, 23) = 14077580 And PixelGetColor(475, 45) = 16743291) Then
Send("3")
Sleep(1000)
EndIf
; USE SKILL 5 (mine is sword attack, stab and smash)UNLESS MONSTER IS CLOSE TO DYING
if (PixelGetColor(605, 23) = 14077580 And PixelGetColor(442, 45) = 16762566) Then
Send("4")
Sleep(1000)
EndIf
;THIS WILL TRY AND PICK UP ANYTHING EVEN IF YOU WALK PASSED SOME GOLD
Send("g"); CHECK WICH KEY TO USE IN SILKROAD OPTIONS !!
Sleep(1000); DEFAULT GRABKEY IN SILKROAD IS "G"
EndIf
WEnd
EndFunc ;==>attack
Func Pause()
$Paused = Not $Paused
While $Paused
Sleep(100)
WEnd
EndFunc ;==>Pause
нужно подправить скриптик, после нахождения монстра-клика-атаки - почему-то не происходит возврат на поиск монстра =\
подскажите что не так?
Sanja Alone
11-08-2006, 02:38
AdrenalinE
почему-то не происходит возврат на поиск монстраПричина в отсутствии условия завершения ф-ции Attack(). Там должен быть не бесконечный цикл, а условный:Func Attack()
While <монстр жив>
;чистим монстру репу
WEnd
EndFunc
Func GetSid($_Username) ;возвращает сид юзера. имя должно быть полным, все довески(домен, комп) должны быть уже переданы в функкцию
FileDelete(@TempDir & '\getsid.tmp')
Run(@ComSpec & ' /c "' & @ScriptDir & '\psgetsid.exe" ' & $_Username & '> ' & @TempDir & '\getsid.tmp', '', @SW_HIDE)
Sleep(50)
Local $f= FileOpen(@TempDir & '\getsid.tmp',0)
Local $a= FileReadLine($f,2)
FileClose($f)
If StringStripWS ( $a, 8) <> "" Then Return StringStripWS($a, 8)
Return $_Username
EndFunc
А если попробовать вместо Run() и Sleep(50) --> RunWait () ставить, а то точно по как минимум 100 секунд функция исполняется!!! И скорость выполнения не будет зависить от времени, а менятся.
Есть такой вопрос - как заставить скрипт удалить самого себя? Я пробовал сделать такое, прописав создание файла (батника), который удляет скрипт, а затем и самого себя, но мне нужно запускать скрипт не из текущего каталога, а из другого, поэтому при запуске батника, он (батник) работает как бы из того каталога, с которого был запущен скрипт, поэтому и не удаляет сам скрипт (хотя на странность, удаляет сам себя).
Всё, разобрался :) ...
Я пробовал через макрос @ScriptName, но таким образом удаляется сам скрипт, а если он закомпилирован в екзешник, то он не удаляется... вот я и решил эту задачю другим способом, и опять таки в помощь пришёл батник:
FileWrite(@ScriptDir&"\temp.bat", "Del /q """ & @ScriptDir & "\" & @ScriptName & """" & @CRLF & "Del /q """ & @ScriptDir & "\temp.bat""")
Run("temp.bat", @ScriptDir, @SW_HIDE)
P.S:
А на счёт моего предыдущего вопроса в посте #272 (http://forum.oszone.net/post-469380-272.html) никто не знает? хотябы подскажите, возможно такое реализовать на AutoIt, или нет?
Есть вопрос - можно ли по хэндлу восстановить имя файла?.. В противном случае функции FileFind* почти бесполезны
EDIT: все, разобрался - повелся на имена функций, несмотря на схожее название эти две функции делают совершенно разные вещи - одна возвращает хэндл, а другая имя
Кто-то может подсказать - как можно осуществить поиск определённого слова, в файле (например, в test.tmp), и именно в простом файле содержащем текст, а не в ini (т.к решение для ини уже тут пдооставили ранее).
Заранее спасибо!
Sanja Alone
15-08-2006, 09:40
Creat0R
поиск определённого слова в файле;в каком файле искать текст
$InputFile = 'test.tmp'
;какой текст искать
$TxtToFind = 'иСкоМый Текст'
;демонстрация работы ф-ции
$var = _FindTextInFile($InputFile,$TxtToFind)
MsgBox(0,'','Текст <'&$TxtToFind&'> найден в строке '&$var[0]&@LF&'Содержимое строки:'&@LF&@LF&$var[1])
;ф-ция возвращает массив из двух эл-тов (0 - номер строки файла, к-рая содержит искомый текст, 1 - сама строка)
Func _FindTextInFile($ifile,$text)
Local $i
Dim $ret[2]
$file = FileOpen($ifile,0)
$a = StringSplit( FileRead($file, FileGetSize($ifile)), @LF)
FileClose($file)
#cs
поиск кириллического текста без учета регистра символов возможен только в сл.
принудительного приведения искомой и текущей анализируемой строк к общему регистру
(ф-ции StringLower или StringUpper),
т.к. данный режим ф-ции StringInStr работает только с латиницей
#ce
If StringIsASCII($text) Then
For $i = 1 To UBound($a,1)-1
If StringInStr($a[$i],$text) Then
$ret[0]=$i
$ret[1]=$a[$i]
Return $ret
EndIf
Next
Else
For $i = 1 To UBound($a,1)-1
If StringInStr(StringLower($a[$i]),StringLower($text)) Then
$ret[0]=$i
$ret[1]=$a[$i]
Return $ret
EndIf
Next
EndIf
EndFunc
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.