Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
Maza Faka
15-02-2008, 11:07
garbage
отследить окончание Program1
Смотри функцию ProcessWaitClose().
zero_1632, MsgBox (4096,$iPID,StdoutRead ($iPID)) - ничего не выводит
Если приложение program.exe пишет в StdOut поток, то можно пробовать читать этот поток, но не одним вызовом, а из цикла...
Run(@ComSpec & " /c echo I am an StdOut Stream Data", "", @SW_SHOW, 2 + 4)
$iPID = ProcessExists("Cmd.exe")
While 1
$Read = StdoutRead($iPID)
If @error Then ExitLoop
MsgBox(0, "STDOUT read:", $Read)
WEnd
Можно ли делать с помощью autoit скриншоты окна или его любой части?
Можно, в последней версии есть функции _ScreenCapture_Capture()/_ScreenCapture_CaptureWnd().
garbage
Кроме упомянутого ProcessWaitClose, если программа запускается из скрипта, то проще использовать RunWait() ;)
SvetlanaK, можно ли вытянуть данные из существующей базы, например из аксесс-а?
Для этого кажется есть отдельные UDF'ы (http://www.autoitscript.com/forum/index.php?showtopic=24149&hl=access).
Может у кого ссылки есть на статьи и литературу по использованию SQLite библиотеки
Только ссылка на оф. форум (http://www.autoitscript.com/forum/index.php?act=Search&CODE=show&searchid=f0ef3f14f50ccc045e3940d189bd15a2&search_in=titles&result_type=topics&highlite=+sqlite) :)
HORRIBLE
17-02-2008, 01:44
У меня проблема возникла. Вот мой код.
.......................................
$i=0
$y = 208
$stroka = 0
do
ClipPut("")
MouseClickDrag("left", 93, $y+$i, 385,$y+$i)
Send("^{c}")
$creater = StringLen(GUICtrlRead($Label_2))
$len = StringLen(ClipGet())
If $len <= 11 then
$Name = ClipGet()
else
$len_1 = $len - $creater
$Name = StringTrimRight(ClipGet(),$len_1)
$len_11 = StringLen($Name)
Endif
$login_2 = GUICtrlRead($Label_2)
$test = StringCompare ( $Name, $login_2,2)
If $test = 0 then
$stroka = $stroka + 1
else
$i =$i + 22
$y_2 = $y+$i
$stroka = $stroka + 1
endif
until $test= 0
MsgBox(0,"","найден в строке: " &$stroka,3)
$len_3 = 0
while $len_3 > $len_11
MouseClickDrag("left", 93, $y_2, 385,$y_2)
Send("^{c}")
$len_3 = StringLen(ClipGet())
Wend
У меня не работает все после while...... как мне достать из первого цикла: $y_2 и $len_11 .
HORRIBLE,
не работает все после while...... как мне достать из первого цикла: $y_2 и $len_11
Во первых, код нужно заключать в тег Code (http://forum.oszone.net/misc.php?do=bbcode#code), а во-вторых, это больше на кашу похоже чем на код :) (без обиды).
Переменная $len_11 объявляется условно, поэтому есть шанс что она не будет создана в момент перехода ко второму циклу (и естественно будет ошибка). Тоже самое и с $y_2.
Что нужно достичь этим скриптом?
Хочу команду ControlGetText ( 'Настройка', '', 'Edit1' ) добавить в цикл, что бы не писать пятдесят с лишним строк.....можно ли как нибудь плюсовать Edit1, что бы получилось Edit2 и тд в этом цикле???
Maza Faka
17-02-2008, 11:45
Angelus,можно ли как нибудь плюсовать Edit1, что бы получилось Edit2 »
For $i = 1 To 50
ControlGetText ('Настройка', '', 'Edit' & $i)
Next
HORRIBLE
17-02-2008, 21:50
Creat0R,
Хы, ну критику ни кто не отменял... Учетем, спасибо..... А если бредово или через одно место ) написано, ну уж как умеем пока), как говориться как умею так и выкручиваюсь ).
Ты имел ввиду,что оформлять надо:
$i=0
$y = 208
$stroka = 0
Do
ClipPut("")
MouseClickDrag("left", 93, $y+$i, 385,$y+$i)
Send("^{c}")
$len = StringLen(ClipGet())
If $len <= 11 then
$Name = ClipGet()
else
$creater = StringLen(GUICtrlRead($Label_2))
$len_1 = $len - $creater
$Name = StringTrimRight(ClipGet(),$len_1)
$len_11 = StringLen($Name)
Endif
$login_2 = GUICtrlRead($Label_2)
$test = StringCompare ( $Name, $login_2,2)
If $test = 0 then
$stroka = $stroka + 1
else
$i =$i + 22
$y_2 = $y+$i
$stroka = $stroka + 1
endif
Until $test= 0
MsgBox(0,"","найден в строке: " &$stroka,3)
$len_3 = 0
while $len_3 > $len_11
MouseClickDrag("left", 93, $y_2, 385,$y_2)
Send("^{c}")
$len_3 = StringLen(ClipGet())
Wend
Эм, этим, я хотел получить такую вещь.....Да это все делается на интернет страничке... Есть список в который я заношу свое имя: $creater , далее после того как имя внесено, оно появляется на n-строчке, которую я определяю (сравнивая скопированную строчку, предварительно обрезав ее до 11 знаков, с $creater ).Это все делается в Do..... Until.
Нашел такую строчку, теперь работаю с ней, жду пока в этой строчке не появиться еще ченить, короче пока длинна не измениться...... Как только появилось, жму на кнопку.... Это должно делаться в while.....Wend
Примерно так.......
Переменная $len_11 объявляется условно, поэтому есть шанс что она не будет создана в момент перехода ко второму циклу (и естественно будет ошибка). Тоже самое и с $y_2.
А как тогда быть?
У меня еще вопpосы:
1. Как отправить в сон неограниченный (или поставить его на паузу) при помощи: HotKeySet
2. Вот есть цикл, как ему сказать, что если он превысил n-е кол-во шагов и не нашел результатов, вернуться в начало и продолжить делать все по новой.
3. Можно ли сделать связь между 2-мя файлами автоита. Ну т.е. есть 2 файла. Первый высчитывает некий параметр, который необходим для работы второго файла, а запускаются эти 2-ва файлика из 3-го файла. Тут вопрос в удобстве, нехочется иметь один файл очень большой, в котором слишком много буков ), а хочется чтоб было 2 но в которых не так много написано.
4. Если уже открыта интернет страница и ее ну ни как закрывать нельзя, как применять команды связанные с управлением IE?
Спасибо!!!
HORRIBLE, критику ни кто не отменял
Это была не критика, а всего лишь совет..
А если бредово или через одно место ) написано, ну уж как умеем пока), как говориться как умею так и выкручиваюсь ).
А вот это неверный подход (тоже на уровне совета пишу ;)) - Если мне нужна помощь, я сделаю всё чтобы любому желающему мне помочь, не нужно было гадать и разгребать непонятный кусок кода, который является частью громадного скрипта. Я сделаю совершенно независемый пример, который максимально отразит суть моей проблемы, чтобы с этим примером было приятно и удобно работать желающему мне помочь.
Ты имел ввиду,что оформлять надо:
Примерно, так хотябы понятнее, уже есть больше желания присмотреться и попытаться найти суть проблемы :).
Эм, этим, я хотел получить такую вещь.....Да это все делается на интернет страничке... Есть список в который я заношу свое имя: $creater , далее после того как имя внесено, оно появляется на n-строчке, которую я определяю (сравнивая скопированную строчку, предварительно обрезав ее до 11 знаков, с $creater ).Это все делается в Do..... Until.
Нашел такую строчку, теперь работаю с ней, жду пока в этой строчке не появиться еще ченить, короче пока длинна не измениться...... Как только появилось, жму на кнопку.... Это должно делаться в while.....Wend
Примерно так.......
Примерно не достаточно, я из вышеописанного так и не понял что требуется... что за список, где $Label_2, и т.п.
А как тогда быть?
Объявлять заранее переменные :)
Как отправить в сон неограниченный (или поставить его на паузу) при помощи: HotKeySet
#include <GuiConstants.au3>
$Paused = False
HotKeySet("^p", "ToggleScriptPause")
$GUI = GUICreate("Test Script", 300, 200)
$PauseToggle_Button = GUICtrlCreateButton("test", 20, 40)
GUISetState(@SW_SHOW, $GUI)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $PauseToggle_Button
MsgBox(0, "", "Just a test")
EndSwitch
WEnd
Func ToggleScriptPause()
$Paused = Not $Paused
Local $iOpt_GOEM = Opt("GuiOnEventMode", 1)
If $iOpt_GOEM = 1 Then Opt("GuiOnEventMode", 0)
While $Paused
Sleep(100)
WEnd
Opt("GuiOnEventMode", $iOpt_GOEM)
EndFunc
Вот есть цикл, как ему сказать, что если он превысил n-е кол-во шагов и не нашел результатов, вернуться в начало и продолжить делать все по новой.
Использовать счётчик, и сбрасывать его при достижении лимита.
;Проверка результата
$Results_Val = 123
;Счётчик попыток
$Loop_Counter = 1
;Лимит попыток
$Loop_Limit_Atempts = 122
While 1
If $Loop_Counter = $Results_Val Then ExitLoop ;Найден результат
If $Loop_Counter > $Loop_Limit_Atempts Then
;Сбрасываем счётчик
$Loop_Counter = 1
ContinueLoop
EndIf
$Loop_Counter += 1
Sleep(1)
WEnd
Можно ли сделать связь между 2-мя файлами автоита
Через #Include...
If MsgBox(36, "Question", "Include second script?") = 6 Then
#include <MySecondScript.au3>
EndIf
MySecondScript.au3:
MsgBox(0, "", "Hi, i am a second script")
;)
Maza Faka, я так пробывал...но он возвращает пустое значение....
HORRIBLE, Если уже открыта интернет страница и ее ну ни как закрывать нельзя, как применять команды связанные с управлением IE?
Как понять “ни как закрывать нельзя”? эта страница открыта скриптом? вообще то в справке есть описания для функии _IE...
Angelus, возвращает пустое значение
Значит неверный элемент.. можно попробовать использовать как CLASSNN...
For $i = 1 To 50
$Text = ControlGetText ('Настройка', '', '[CLASSNN:Edit' & $i & ']')
Next
Или просто CLASS.
Может глупый вопрос, но... нашел тут на форуме такой AutoIt-скрипт создания удаленного соединения:
Run("rundll32.exe netshell.dll,StartNCW")
WinWaitActive ('Мастер новых подключений','Мастер новых подключений')
Send('{Enter}')
Sleep ('500')
WinWaitActive ('Мастер новых подключений','Подключить к Интернету для просмотра веб-узлов и чтения электронной почты.')
ControlClick ('Мастер новых подключений','Подключить к Интернету для просмотра веб-узлов и чтения электронной почты.','Button1')
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Каким образом подключиться к Интернету')
ControlClick ('Мастер новых подключений','Каким образом подключиться к Интернету','Button2')
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Данное подключение использует модем и обычную телефонную линию или телефонную линию ISDN.')
ControlClick ('Мастер новых подключений','Данное подключение использует модем и обычную телефонную линию или телефонную линию ISDN.','Button1')
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Им&я поставщика услуг')
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', 'Peterstar' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Номер &телефона:')
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', '3203370,,,' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','&Имя пользователя:')
sleep (100)
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', 'Login')
sleep (100)
ControlSetText ( 'Мастер новых подключений', '', 'Edit2', 'Password')
Send('{tab}')
sleep (100)
ControlSetText ( 'Мастер новых подключений', '', 'Edit3', 'Password')
Sleep ('500')
ControlCommand ( 'Мастер новых подключений', '', 'Button13', 'Check', '' )
ControlCommand ( 'Мастер новых подключений', '', 'Button2', 'Check', '' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Завершение работы мастера новых подключений')
ControlCommand ( 'Мастер новых подключений', '', 'Button20', 'UnCheck', '' )
Send('{Enter}')
Exit
Можно ли чуть-чуть его усовершенствовать. Дело в том, что номер дозвона и имя соединения должны быть заданы как тут,а логин и пароль скрипт должен спросить у пользователя. Или это никак не сделать? Я имею ввиду, чтобы после запуска скрипт вывелось окно "Введите логин и пароль" с этими полями. А все остальное как тут.
Все! Нашел! Надо добавить в самый верх скрипта:
$login= InputBox("Установка Интернета", "Введите логин Интернета:", "", "")
А потом в скрипте убрать 'Login', а вместо него написать $login
С паролем все по аналогии.
Не понял одно, как сделать, чтобы при нажатии Cancel работа скрипт завершалась, а не переходила как по OK к следующему окну.
Сделал проверку данных примерно так:
if $name = '' Then Exit
Но как перед выходом вывести окно типа "Установка Интернета не удалась."?
Котяра,
Надо добавить в самый верх скрипта:
Можно и так, а можно создать сразу окошко с двумя полями ввода..
_Input_LoginPass_Dialog()
If @error Then Exit
;Тут основное содержание скрипта
Func _Input_LoginPass_Dialog()
#include <GuiConstants.au3>
Local $GUI = GUICreate("Ввод данных", 300, 200)
GUICtrlCreateLabel("Ввод логина:", 20, 30)
Local $Login_Input = GUICtrlCreateInput("", 20, 50, 260, 20)
GUICtrlCreateLabel("Ввод пароля:", 20, 90)
Local $Password_Input = GUICtrlCreateInput("", 20, 110, 260, 20)
Local $OK_Button = GUICtrlCreateButton("OK", 20, 160, 60, 20)
Local $Cancel_Button = GUICtrlCreateButton("Отмена", 100, 160, 60, 20)
GUISetState(@SW_SHOW, $GUI)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE, $Cancel_Button
GUIDelete($GUI)
Return SetError(1, 0, 0)
Case $OK_Button
Local $aRet[2] = [GUICtrlRead($Login_Input), GUICtrlRead($Password_Input)]
If $aRet[0] = "" Then
MsgBox(48, "Внимание!", "Введите пожалуйста логин.")
ControlFocus($GUI, "", $Login_Input)
ContinueLoop
EndIf
If $aRet[1] = "" Then
MsgBox(48, "Внимание!", "Введите пожалуйста пароль.")
ControlFocus($GUI, "", $Password_Input)
ContinueLoop
EndIf
GUIDelete($GUI)
Return $aRet
EndSwitch
WEnd
EndFunc
как сделать, чтобы при нажатии Cancel работа скрипт завершалась
Нужно проверять @error:
$login= InputBox("Установка Интернета", "Введите логин Интернета:", "", "")
If @error = 1 Then Exit
Но как перед выходом вывести окно типа "Установка Интернета не удалась."?
$login = InputBox("Установка Интернета", "Введите логин Интернета:", "", "")
If @error = 1 Or $login = "" Then
MsgBox(48, "Внимание!", "Установка Интернета не удалась." & @LF & @LF & "OK ----> EXIT")
Exit
EndIf
Creat0R, спасибо за ответ.
Теперь я делаю так, чтобы спрашивались 4 параметра: имя подключения, номер, логин, пароль. Цель: создать программу, которая помогала бы "чайникам" настроить подключение к Интернету
Котяра,
Теперь я делаю так, чтобы спрашивались 4 параметра: имя подключения, номер, логин, пароль.
Получилось? :)
На всякий случай:
$aInputs = _Input_LoginPass_Dialog()
If @error Then Exit
$ConnectionName = $aInputs[0]
$Number = $aInputs[1]
$Login = $aInputs[2]
$Password = $aInputs[3]
MsgBox(64, "Результаты:", _
StringFormat("Имя подключения: %s \nНомер: %s \n\nЛогин: %s \nПароль: %s", _
$aInputs[0], $aInputs[1], $aInputs[2], $aInputs[3]))
;Тут основное содержание скрипта
Func _Input_LoginPass_Dialog()
#include <GuiConstants.au3>
Local $GUI = GUICreate("Ввод данных", 300, 280)
GUICtrlCreateLabel("Ввод имени подключения:", 20, 20)
Local $ConnectionName_Input = GUICtrlCreateInput("", 20, 40, 260, 20)
GUICtrlCreateLabel("Ввод номера (подключения?):", 20, 70)
Local $Number_Input = GUICtrlCreateInput("", 20, 90, 260, 20)
GUICtrlCreateLabel("Ввод логина:", 20, 120)
Local $Login_Input = GUICtrlCreateInput("", 20, 140, 260, 20)
GUICtrlCreateLabel("Ввод пароля:", 20, 170)
Local $Password_Input = GUICtrlCreateInput("", 20, 190, 260, 20, $ES_LEFT+$ES_AUTOHSCROLL+$ES_PASSWORD)
Local $OK_Button = GUICtrlCreateButton("OK", 20, 240, 60, 20)
Local $Cancel_Button = GUICtrlCreateButton("Отмена", 100, 240, 60, 20)
GUISetState(@SW_SHOW, $GUI)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE, $Cancel_Button
GUIDelete($GUI)
Return SetError(1, 0, 0)
Case $OK_Button
Local $aRet[4]
$aRet[0] = GUICtrlRead($ConnectionName_Input)
$aRet[1] = GUICtrlRead($Number_Input)
$aRet[2] = GUICtrlRead($Login_Input)
$aRet[3] = GUICtrlRead($Password_Input)
If $aRet[0] = "" Then
MsgBox(48, "Внимание!", "Введите пожалуйста имя подключения.")
ControlFocus($GUI, "", $ConnectionName_Input)
ContinueLoop
EndIf
If $aRet[1] = "" Then
MsgBox(48, "Внимание!", "Введите пожалуйста номер (подключения?).")
ControlFocus($GUI, "", $Number_Input)
ContinueLoop
EndIf
If $aRet[2] = "" Then
MsgBox(48, "Внимание!", "Введите пожалуйста логин.")
ControlFocus($GUI, "", $Login_Input)
ContinueLoop
EndIf
If $aRet[3] = "" Then
MsgBox(48, "Внимание!", "Введите пожалуйста пароль.")
ControlFocus($GUI, "", $Password_Input)
ContinueLoop
EndIf
GUIDelete($GUI)
Return $aRet
EndSwitch
WEnd
EndFunc
Известно что у функции FileSetTime есть баг (http://svn.autoitscript.com/trac/ticket/19) (довольно критичный в моём случае).
Установленные секунды округляются до чётного числа:
$File = @TempDir & "\Test.txt"
$hOpenFile = FileOpen($File, 2)
FileWrite($hOpenFile, "Test")
FileClose($hOpenFile)
$SetTime = 20060322083529 ; - 2
FileSetTime($File, $SetTime)
$GetTime = FileGetTime($File, 0, 1)
MsgBox(0, "", StringFormat("Set Time: %s \nGet Time: %s", $SetTime, $GetTime))
FileDelete($File)
Мне нужно установить время какими нибудь другими средствами (API?), более точными, но не используя внешние утилиты (типа Nircmd (http://www.nirsoft.net/utils/nircmd.html)).
Это возможно реализовать? нет возможности ждать пока исправят это дело в AutoIt (на бету переходить не могу по техническим причинам :) ).
P.S
А на счёт печяти никто так и не знает решения? amel27, не подскажешь? :shuffle:
Creat0R, у меня получается. Вообще, AutoIt, классная штука :)
Можно даже программы писать. Например, деинсталлятор:
$proceeduninstall = MsgBox(4148, "Внимание!", "Сейчас программа будет удалена. Хотите продолжить?")
if $proceeduninstall = '7' Then Exit
FileDelete(@ScriptDir & "\example.txt")
Правильно я понял, как деинсталлятор делать?
тут удаляется один файл example.txt
Uninstall.exe (скомпиленный скрипт) кладете в папку программу
Котяра, Правильно я понял, как деинсталлятор делать?
Простой, да. Если делать более продвинуты, например, чтобы брал информацию об установленных приложении с системы, то нужно поработать ещё :) - Например вот неплохой деинсталлятор (http://www.autoitscript.com/forum/index.php?showtopic=20406&hl=uninstall).
А если делать деинсталлятор для своей проги, то желательно чтобы он умел читать лог файл, который оставил за собой инсталлятор, и удалять только не тронутые (не изменённые) файлы ;).
http://creator-lab.ucoz.ru/Images/CaptureIt_Icon.png
CaptureIt v1.0 (http://creator-lab.ucoz.ru/load/4-1-0-39) - Эта утилита предназначена для захвата изображений с вашего экрана.
=================
Главные возможности:
=================
Захват всего экрана.
Захват отдельных окон или выбранных элементов окна.
Захват выбранной части экрана.
Сохранение захваченного изображения в тихом режиме.
Открытие захваченного изображения в графическом редакторе.
Вывод на печать захваченного изображения.
Помещение захваченного изображения в буфер обмена.
Закачка захваченного изображения (на imageshack.us (http://imageshack.us)).
Поддерживаемые форматы изображений:
PNG
GIF
JPG - Качество настраивается.
BMP - Формат настраивается.
Особое спасибо amel27 за функции _FileOpen/SaveDialog, и за решение с улавливанием событий мышки :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.