Войти

Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.


Страниц : 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

Maza Faka
15-02-2008, 11:07
garbage
отследить окончание Program1
Смотри функцию ProcessWaitClose().

Creat0R
15-02-2008, 15:00
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 .

Creat0R
17-02-2008, 02:19
HORRIBLE,
не работает все после while...... как мне достать из первого цикла: $y_2 и $len_11

Во первых, код нужно заключать в тег Code (http://forum.oszone.net/misc.php?do=bbcode#code), а во-вторых, это больше на кашу похоже чем на код :) (без обиды).

Переменная $len_11 объявляется условно, поэтому есть шанс что она не будет создана в момент перехода ко второму циклу (и естественно будет ошибка). Тоже самое и с $y_2.

Что нужно достичь этим скриптом?

Angelus
17-02-2008, 10:17
Хочу команду 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?
Спасибо!!!

Creat0R
18-02-2008, 00:51
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")

;)

Angelus
18-02-2008, 10:40
Maza Faka, я так пробывал...но он возвращает пустое значение....

Creat0R
18-02-2008, 10:51
HORRIBLE, Если уже открыта интернет страница и ее ну ни как закрывать нельзя, как применять команды связанные с управлением IE?
Как понять “ни как закрывать нельзя”? эта страница открыта скриптом? вообще то в справке есть описания для функии _IE...

Angelus, возвращает пустое значение
Значит неверный элемент.. можно попробовать использовать как CLASSNN...

For $i = 1 To 50
$Text = ControlGetText ('Настройка', '', '[CLASSNN:Edit' & $i & ']')
Next

Или просто CLASS.

Котяра
19-02-2008, 20:59
Может глупый вопрос, но... нашел тут на форуме такой 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

Можно ли чуть-чуть его усовершенствовать. Дело в том, что номер дозвона и имя соединения должны быть заданы как тут,а логин и пароль скрипт должен спросить у пользователя. Или это никак не сделать? Я имею ввиду, чтобы после запуска скрипт вывелось окно "Введите логин и пароль" с этими полями. А все остальное как тут.

Котяра
19-02-2008, 21:23
Все! Нашел! Надо добавить в самый верх скрипта:

$login= InputBox("Установка Интернета", "Введите логин Интернета:", "", "")

А потом в скрипте убрать 'Login', а вместо него написать $login
С паролем все по аналогии.

Не понял одно, как сделать, чтобы при нажатии Cancel работа скрипт завершалась, а не переходила как по OK к следующему окну.

Котяра
19-02-2008, 21:57
Сделал проверку данных примерно так:

if $name = '' Then Exit

Но как перед выходом вывести окно типа "Установка Интернета не удалась."?

Creat0R
19-02-2008, 22:11
Котяра,
Надо добавить в самый верх скрипта:
Можно и так, а можно создать сразу окошко с двумя полями ввода..


_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

Котяра
20-02-2008, 00:34
Creat0R, спасибо за ответ.
Теперь я делаю так, чтобы спрашивались 4 параметра: имя подключения, номер, логин, пароль. Цель: создать программу, которая помогала бы "чайникам" настроить подключение к Интернету

Creat0R
20-02-2008, 00:55
Котяра,
Теперь я делаю так, чтобы спрашивались 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

Creat0R
20-02-2008, 08:18
Известно что у функции 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:

Котяра
20-02-2008, 20:19
Creat0R, у меня получается. Вообще, AutoIt, классная штука :)
Можно даже программы писать. Например, деинсталлятор:

$proceeduninstall = MsgBox(4148, "Внимание!", "Сейчас программа будет удалена. Хотите продолжить?")
if $proceeduninstall = '7' Then Exit
FileDelete(@ScriptDir & "\example.txt")

Правильно я понял, как деинсталлятор делать?

тут удаляется один файл example.txt
Uninstall.exe (скомпиленный скрипт) кладете в папку программу

Creat0R
20-02-2008, 21:32
Котяра, Правильно я понял, как деинсталлятор делать?
Простой, да. Если делать более продвинуты, например, чтобы брал информацию об установленных приложении с системы, то нужно поработать ещё :) - Например вот неплохой деинсталлятор (http://www.autoitscript.com/forum/index.php?showtopic=20406&hl=uninstall).

А если делать деинсталлятор для своей проги, то желательно чтобы он умел читать лог файл, который оставил за собой инсталлятор, и удалять только не тронутые (не изменённые) файлы ;).

Creat0R
21-02-2008, 12:04
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