Войти

Показать полную графическую версию : [Архив - Часть 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

samara_andrey
12-09-2008, 16:39
логин и пароль изменены , по соображениями безопасности

Рысь
12-09-2008, 17:17
samara_andrey, я не особенно вдавался в суть скрипта (ошибок там не искал), но ето простой опрос на наличие новой версии программы, Вы говорили что видите как скрипт работает в цикле, или Вы не дали весь код проги или здесь просто нету цикла, есть условие которое выполняется-или не выполняется 1 раз)
а если при загрузке системы Вы сидите не под НАТом, то инет у вас включается на автоматически, следовательно секунд 30-40 после загрузки системы у Вас интернета нету, условие в ето время пытается получить файл с фтп, получает ошибку - нету инета и заканчивает выполнять программу, поскольку цикл опроса не организован
Ниже скрипт с использованием цикла

Opt ("TrayIconHide", 1)
Sleep(5000)

While 1

; я использую такой оборот, чтобы ждать появление соединения с интернетом, только когда оно появится - продолжить выполнение скрипта
Do
$size=InetGetSize("http://xxxxxx.html") ; - файл, имеющий размер больше 1 Байта, если инета нету - размер файла не может быть получен и отдаётся 0 и мы вновь опрашиваем его размер
Sleep(500)
Until $size > 1

InetGet("ftp://0000:0000000000@ftp.narod.ru/ini.ini", "ini.ini", 1)
$file = FileOpen("ini.ini", 0)
$chars = FileRead($file)
$file1 = FileOpen("dataini.ini", 0)
$chars1 = FileRead($file1)
if $chars <= $chars1 Then
Run ("installupdate.exe", "", @SW_HIDE)
Run ("rec.exe", "", @SW_HIDE)
Sleep(30000); pause 0.5 min
FileDelete("installupdate.exe")
FileClose($file)
FileDelete("ini.ini")
Exit
Else
FileClose($file)
FileClose($file1)
Sleep(5000) ; pause 5 sec
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec.jpg", "rec.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec2.jpg", "rec2.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec3.jpg", "rec3.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec4.jpg", "rec4.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec5.jpg", "rec5.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec6.jpg", "rec6.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec7.jpg", "rec7.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec8.jpg", "rec8.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec9.jpg", "rec9.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec10.jpg", "rec10.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/installupdate.exe", "installupdate.exe", 1)
Sleep(5000);pause 5 sec
Run ("installupdate.exe", "", @SW_HIDE)
Run ("rec.exe", "", @SW_HIDE)
Sleep(30000); pause 0.5 min
FileDelete("installupdate.exe")
FileDelete("ini.ini")
$file1 = FileOpen("dataini.ini", 2)
FileWrite($file1, $chars)
FileClose($file1)
EndIf


;Здесь ставим время ожидания, чтобы не опрашивать сервер на обновление каждые 40-50 секунд, будем, например опрашивать каждые 5 минут
Sleep(300000) ; 5*60 000 = 300 000 - время ожидания 5 минут
Wend

Также рекомендую Вам убрать строку Opt ("TrayIconHide", 1) (если Вы её уберёте, то иконка скрипта при выполнении будет видна в трее) и добавить AutoItSetOption("TrayIconDebug", 1) - очень полезно для отладки скрипта, при выполнении скрипта при наведении мышки на иконку в трее - Вы будете видеть номер строки кода, выполняемой в данный момент скриптом и сможете понять где ошибка, также можно добавлять всюду выдачу Сообщений с описанием на какой строке скрипт находится и что щас будет делать


P.S. Скажите, пожалуйста, как окрашивать код в цвета Автоита при посте на форуме? :)

Creat0R
12-09-2008, 17:19
в чем разница между запуском через автозагрузку и просто кликом »
Возможно через автозагрузку она запускается с параметрами?
Это можно посмотреть в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

samara_andrey
12-09-2008, 17:28
да вы правы я дал не весь код. цикл там есть и увеличивать время не надо, опрос продолжается все время циклически независимо от того получен результат или нет.
сама фишка просто в том, что он не качает с фтп если запускается через автозагрузку. в реестре он записан верно без лишних параметров(это на сто пудов).
это что-то именно с вистой связано, на хп этот код работает в таком же виде - и все ровно.

кстати пробовал скачать через http вмеcто ftp, получается такая же петрушка.


как красить цвета, я если честно этой целью не задавался)))))))) и без этого хватает гемора когда что-то не получается)))))))

ваше решение ожидания инета тоже очень интересное, спасибо, пополню свой багаж))). я обычно использую ping для определения инета.
ладно, спасибо за потраченное время, будем думать)))))

samara_andrey
12-09-2008, 18:15
Creat0R

-------------------------------------------------------------------------------

Цитата samara_andrey:
в чем разница между запуском через автозагрузку и просто кликом »

Возможно через автозагрузку она запускается с параметрами?
Это можно посмотреть в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run


ВОТ! "в чем разница между запуском через автозагрузку и просто кликом " - это и стало главным вопросом на который мы пока не нашли ответа!!!
по сути дела разницы никакой,НО! когда запускаешь ручками с помощью клика - работает!, а когда через автозагрузку - хоть ты тресни!!! напомню что учетная запись одна и никаких параметров в реестре лишних нет при запуске. ВОТ В ЧЕМ ВОПРОС! а в хп работает отлично хоть так хоть эдак))))))))))))))

короче с вистой всегда был и будет кажется гемор, аж страшно подумать что придет ей на смену))))))))))))

samara_andrey
12-09-2008, 18:47
вот кстати народ вам живой пример для размышления!
работает просто но результат аналогичный предыдущему скрипту!


1.возьмите этот код и скомпильте *.exe , слюбой картинкой 800*600
2.под вистой запустите exe руками, посмотрите на результат
3.потом пропишите exe в автозагрузку, перегрузитесь и посмотрите на результат теперь!

у кого все получилось , то в первом варианте картинка есть, а во втором есть только окно без картинки!

#include <GUIConstants.au3>
GUICreate("picture",800,600,-1,-1) ; will create a dialog box that when displayed is centered

GUISetBkColor (0xE0FFFF)
$n=GUICtrlCreatePic("xp.jpg",1,1, 800,600)

GUISetState ()

; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()

If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

Creat0R
12-09-2008, 18:54
ВОТ! "в чем разница между запуском через автозагрузку и просто кликом " - это и стало главным вопросом на который мы пока не нашли ответа!!! »
Ответ на это уже вроде озвучили - При запуске в автозагрузке скрипт выполняется с другими условиями, например (в Vista возможно это так) не разрешается запуск програм или закачка файлов пока не запустится в системе какой то сервис, контролирующий всё это дело.

Чтобы найти решение, нужно добавить проверки на ошибочность, вот так:

#NoTrayIcon

Sleep(5000)

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/ini.ini", "ini.ini", 1)
If Not $iRet Then _ShowError_Proc(1, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/ini.ini", "ini.ini", 1)')

$file = FileOpen("ini.ini", 0)
If $file = -1 Then _ShowError_Proc(2, '$file = FileOpen("ini.ini", 0)')

$chars = FileRead($file)
$file1 = FileOpen("dataini.ini", 0)
If $file1 = -1 Then _ShowError_Proc(3, '$file1 = FileOpen("dataini.ini", 0)')

$chars1 = FileRead($file1)

If $chars <= $chars1 Then
Run("installupdate.exe", "", @SW_HIDE)
If @error Then _ShowError_Proc(4, 'Run("installupdate.exe", "", @SW_HIDE)')

Run("rec.exe", "", @SW_HIDE)
If @error Then _ShowError_Proc(5, 'Run("rec.exe", "", @SW_HIDE)')

Sleep(30000); pause 0.5 min

FileDelete("installupdate.exe")
FileClose($file)
FileDelete("ini.ini")

Exit
Else
FileClose($file)
FileClose($file1)

Sleep(5000) ; pause 5 sec

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec.jpg", "rec.jpg", 1)
If Not $iRet Then _ShowError_Proc(6, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec.jpg", "rec.jpg", 1)')

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec2.jpg", "rec2.jpg", 1)
If Not $iRet Then _ShowError_Proc(7, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec2.jpg", "rec2.jpg", 1)')

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec3.jpg", "rec3.jpg", 1)
If Not $iRet Then _ShowError_Proc(8, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec3.jpg", "rec3.jpg", 1)')

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec4.jpg", "rec4.jpg", 1)
If Not $iRet Then _ShowError_Proc(9, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec4.jpg", "rec4.jpg", 1)')

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec5.jpg", "rec5.jpg", 1)
If Not $iRet Then _ShowError_Proc(10, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec5.jpg", "rec5.jpg", 1)')

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec6.jpg", "rec6.jpg", 1)
If Not $iRet Then _ShowError_Proc(11, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec6.jpg", "rec6.jpg", 1)')

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec7.jpg", "rec7.jpg", 1)
If Not $iRet Then _ShowError_Proc(12, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec7.jpg", "rec7.jpg", 1)')

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec8.jpg", "rec8.jpg", 1)
If Not $iRet Then _ShowError_Proc(13, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec8.jpg", "rec8.jpg", 1)')

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec9.jpg", "rec9.jpg", 1)
If Not $iRet Then _ShowError_Proc(14, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec9.jpg", "rec9.jpg", 1)')

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec10.jpg", "rec10.jpg", 1)
If Not $iRet Then _ShowError_Proc(15, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec10.jpg", "rec10.jpg", 1)')

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/installupdate.exe", "installupdate.exe", 1)
If Not $iRet Then _ShowError_Proc(16, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/installupdate.exe", "installupdate.exe", 1)')

Sleep(5000);pause 5 sec

Run("installupdate.exe", "", @SW_HIDE)
If @error Then _ShowError_Proc(17, 'Run("installupdate.exe", "", @SW_HIDE)')

Run("rec.exe", "", @SW_HIDE)
If @error Then _ShowError_Proc(18, 'Run("rec.exe", "", @SW_HIDE)')

Sleep(30000); pause 0.5 min

FileDelete("installupdate.exe")
FileDelete("ini.ini")

$file1 = FileOpen("dataini.ini", 2)
If $file1 = -1 Then _ShowError_Proc(19, '$file1 = FileOpen("dataini.ini", 2)')

FileWrite($file1, $chars)
FileClose($file1)
EndIf

Func _ShowError_Proc($iError, $sErrMsg)
MsgBox(262144+16, "MyApp - Error", StringFormat("Error Number: %i\n\nError Line:\n%s\n\nOK ===> EXIT", $iError, $sErrMsg))
Exit
EndFunc

Если появится сообщение об ошибке при автозапуске, значит нужно копать в сторону этой ошибки (будет выведена строка вызывающая ошибку, а также порядковый номер ошибки, для лучшего распознавания).

вот кстати народ вам живой пример для размышления! »
Я если честно долго не размышлял, тут проблема ясна, при запуске с автозагрузки программа не может найти путь к файлу изображения :) - Нужно указывать полный путь. Видимо таже проблема и в первом скрипте ;)

Creat0R
13-09-2008, 02:11
Вдохновлённый идеей из одной темы (http://www.autoitscript.com/forum/index.php?showtopic=79879&st=0&p=575411&#entry575411) на оф. форуме, сделал UDF _AutoItErrorHandler - Перехватывает критичные сообщения об ошибках и выводит самопальный диалог-отладчик, хотя отлаживать на данный момент конечно нереально, но можно к примеру посмотреть сообщение ошибки, перезапустить программу, отправить отчёт об ошибке (для этой части нужно ещё кусок кода дописать, вообще то сам процесс отправки :)), ну или просто закрыть приложение.

Этот UDF это всего лишь демонстрация того что можно сделать, диалог естественно можно изменить, функции убрать/добавить и т.д.

Вот скриншот:

http://pic.ipicture.ru/uploads/080913/thumbs/JDYoFZB3gj.png (http://ipicture.ru/Gallery/Viewfull/6792107.html)

UDF прикрепил к сообщению.
В архиве две версии, одна с использованием StdOut, она более надёжнее, но проблема в том что скрипт не работает в режиме CUI в этой версии. Вторая версия не использует StdOut, она ждёт появления стандартного окна об ошибке от AutoIt'а, быстро(!) (почти мгновенно) закрывает его, и выводит своё окно.

P.S
Есть один минус конечно (как всегда с хорошими идеями :( ) - Запускаются два процесса скрипта, вместо одного.

Maza Faka
13-09-2008, 09:24
samara_andrey
Попробуй вставить в начало скрипта задержку на несколько минут (столько, сколько по твоему мнению нужно, что бы появилось подключение к интернету) и если проблема не исчезнет, значит дело в самой автозагрузке, а не в скрипте. Для проверки можно добавить в автозагрузку, ну скажем Оперу с указанием стартовать домашнюю страницу и аналогично отслеживать активность.

Creat0R
Спасибо за UDF :up:

lAGRESSORl
1. проверить папку на удаленном компьютере на наличие файлов создать очет есть или нет (если возможно то как давно).

$sDir = "\\compname\c\MyFolder"
FileExists($sDir)
FileGetTime($sDir, 1, 1)


2. подцепиться к этой же машине, через РДП (Server 2003)
Не знаю, что такое РДП :)

3. запустить определёную программу (софт)
Смотрим с справке:

Run()
ShellExecute()


4. сделать скрин шот
5. закрыть и сохранить отчет с картинкой в папке (фолдер).
Опять же смотрим в справке:

_ScreenCapture_Capture()


6. (ну это вообше тяжко) послать папку на мыло или браузер
Ищем здесь и на офф. форуме примеры и UDF. :)

amel27
14-09-2008, 11:35
samara_andrey
в чем разница между запуском через автозагрузку и просто кликом »В текущем каталоге запуска - при клике: @StartupDir, при Автозагрузке в XP: @HomeDrive & @HomePath, при Автозагрузке в Vista: @SystemDir, т.е. скрипт по ходу просто не находит скачанный файл в текущей папке - задай явно путь к папке назначения и используй этот же путь при открытии файла.


lAGRESSORl
на кой ты клонируешь посты?.. сказал же про RDP (http://forum.oszone.net/thread-106528-33.html) - он тебе скорее всего не нужен и используй для подключения PSExec, по поводу всего остального вот стартовый пример, конкретные вопросы (после обращения к справке и поиска в форуме) можешь задавать сюда ;)#include <ScreenCapture.au3>

$ProgTitle = "Диспетчер задач Windows" ; Имя титульного окна программы
$ProgPath = "C:\WINDOWS\System32\TaskMgr.exe" ; Полное имя программы
$ProgHome = "C:\WINDOWS\System32" ; Каталог запуска программы
$ImagePath = @TempDir ; Папка для сохранения скриншота

$ImageFile = $ImagePath & "\~Screen.jpg" ; Временное имя файла скриншота
If FileExists($ImageFile) Then FileDelete($ImageFile) ; Если файл уже есть, то удаляем его

; Если программа еще не запущена, то запускаем
If Not(WinExists($ProgTitle)) Then Run($ProgPath, $ProgHome, @SW_MAXIMIZE)

; Ожидание инициализации программы
WinWait($ProgTitle) ; Ожидание окна
Sleep(3000) ; Пауза 3 секунды
$hWnd = WinGetHandle($ProgTitle) ; Получаем описатель окна
WinActivate($hWnd) ; Делаем окно текущим

; Сохранение скриншота в файле
$i = _ScreenCapture_CaptureWnd ($ImageFile, $hWnd) ; Сохранение под временным именем
$FileNewName = $ImagePath & "\" & FileGetTime($ImageFile, 0, 1) & ".jpg" ; Новое имя по дате/времени
FileMove($ImageFile, $FileNewName) ; Переименование
;WinClose($ProgTitle) ; Тут можно закрыть программу

FunkyByte
14-09-2008, 23:52
А можно при помощи AutoIt запускать/останавливать службы Windows?

Maza Faka
15-09-2008, 07:36
FunkyByte
Пример:
Run(@ComSpec & ' /c net stop "Диспетчер очереди печати"', @SystemDir, @SW_HIDE) ;останавливаем службу
Run(@ComSpec & ' /c net start "Диспетчер очереди печати"', @SystemDir, @SW_HIDE) ;запускаем службу

amel27
15-09-2008, 07:39
FunkyByte

...или через WMI:
Func _ServiceStart($sService, $sComputer = "localhost")
Local $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
Local $sQuery = "Select * From Win32_Service Where Name Like '"& $sService &"'"
Local $iRet, $colItems = $objWMI.ExecQuery($sQuery)
For $objService In $colItems
If $objService.State = "Stopped" Then
$iRet = $objService.StartService($objService.Name)
If $iRet=0 Then Return True
ElseIf $objService.State = "Running" Then
Return True
EndIf
Next
Return False
EndFunc

Func _ServiceStop($sService, $sComputer = "localhost")
Local $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
Local $sQuery = "Select * From Win32_Service Where Name Like '"& $sService &"'"
Local $iRet, $colItems = $objWMI.ExecQuery($sQuery)
For $objService In $colItems
If $objService.State = "Running" Then
$iRet = $objService.StopService($objService.Name)
If $iRet=0 Then Return True
ElseIf $objService.State = "Stopped" Then
Return True
EndIf
Next
Return False
EndFunc

FunkyByte
15-09-2008, 10:22
Спасибо. Помогло.

HORRIBLE
16-09-2008, 17:59
Встала такая проблемка:
Есть 3 файла, называются они lico, func_1, func_2, код простой, так для примера:

lico.au3

#include <GUIConstantsEx.au3>


HotKeySet("{ESC}","term")

GUICreate("", 1000, 700)

$label_for_func_1 = GUICtrlCreateLabel("Sost func_1 ",10,10,60,20)
$label_for_func_2 = GUICtrlCreateLabel("Sost func_2 ",10,50,60,20)

$input_for_func_1 = GUICtrlCreateInput("0",100,10,60,20)
$input_for_func_2 = GUICtrlCreateInput("0",100,50,60,20)

$button_for_func = GUICtrlCreateButton("Turn on func_1 and 2",170,50,150,20)

$label_from_func_1 = GUICtrlCreateLabel("",350,10,100,20)
$label_from_func_2 = GUICtrlCreateLabel("",350,50,100,20)

GUISetState()

While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit

Case $msg = $button_for_func
; #include <func two.au3>
; #include <func one.au3>
; ShellExecute("func one.exe","","","open")
; ShellExecute("func two.exe","","","open")
EndSelect
WEnd


func term()
Exit
EndFunc


func_1.au3


while 1

if GUICtrlRead($input_for_func_1) = 1 then
GUICtrlSetData($label_from_func_1, "1-я задержка 5 с.")
sleep(5000)
GUICtrlSetData($label_from_func_1, "2-я задержка 2 с.")
sleep(2000)
GUICtrlSetData($label_from_func_1, "сост. 1")
Else
GUICtrlSetData($label_from_func_1, "сост. 0")
EndIf
wend


func_2.au3

while 1
if GUICtrlRead($input_for_func_2) = 1 then
GUICtrlSetData($label_from_func_2, "Задержка 10 с.")
sleep(10000)
GUICtrlSetData($label_from_func_2, "Сост. 1")
Else
GUICtrlSetData($label_from_func_2, "Сост. 0")
EndIf
wend

Смысл работы, как только я нажимаю кнопочку $button_for_func, два файлика func_1, func_2 должны запуститься и висеть в памяти и смотреть, что вписано в $input_for_func_1, $input_for_func_2 и в зависимости от того, что в них вписано выполнять те или иные предписания.

Вроде просто, как мне казалось, а может оно так и есть, я может чего то недопонимаю.

Что я делал, написал событие для кнопки $button_for_func сперва такое: #include <func_1.au3>, #include <func_2.au3>, даже заработало, правда только первый файл, ну тут ясно почему из-за бесконечного цикла...
далее переправил на shellExecute("func_1.exe","","","open"), ShellExecute("func_2.exe","","","open"), нажал на кнопочку все туже и сразу же словил ошибку, переменные без объявления, хотя файлы просто были скомпилированы и в них я ничего не менял!
я попробовал вообще через одно м..то сделать, создал ini и туда записывал, что считывал с $input_for_func_1, $input_for_func_2, а потом файлики func_2 и func_1 считывали из это ini делали, что нужно, записывали в эту же ini далее файл lico считывал из ini что ему пришло и вписывал эти данные куда надо.
Это муторно и медленно работало.

Такая проблема возникла из за того, что func_1 и func_2 реализуют алгоритм работы 2-х устройств, каждое устройство имеет свой алгоритм, свои задерки и так далее, вот и понадобилось создавать отдельные файлы.

Подскажите, как все таки реализовать смысл работы?
Спасибо.

Рысь
16-09-2008, 19:22
HORRIBLE, всё просто, на мой взгляд у Вас геморный метод, но какой есть)

Вам нужно лишь добавить в каждую функцию (func_1.au3 и func_2.au3) объявления переменных
func_1.au3 :
Dim $input_for_func_1, $label_from_func_1

В func_2.au3 :
Dim $input_for_func_2, $label_from_func_2

Также советую добавить в func_1.au3 и func_2.au3 такие строчки, только с разными символами, при повторном нажатии на кнопку запуска 2-х ехе программа будет выдавать сообщение о том, что такие процессы уже запущены

if _Singleton("Символы характеризующие первую функцию",1) = 0 Then
MsgBox(16, "Ошибка!", "Программа уже запущена.")
Exit
EndIf

и немного переделать основной скрипт, так будет удобнее, если в основном цикле Вы будете что-то делать:

#include <GUIConstantsEx.au3>
HotKeySet("{ESC}","term")
GUICreate("fgfgfgfgfgfgfgfg", 350, 150)
$label_for_func_1 = GUICtrlCreateLabel("Sost func_1 ",10,10,60,20)
$label_for_func_2 = GUICtrlCreateLabel("Sost func_2 ",10,50,60,20)
$input_for_func_1 = GUICtrlCreateInput("0",100,10,60,20)
$input_for_func_2 = GUICtrlCreateInput("0",100,50,60,20)
$button_for_func = GUICtrlCreateButton("Turn on func_1 and 2",170,50,150,20)
$label_from_func_1 = GUICtrlCreateLabel("",350,10,100,20)
$label_from_func_2 = GUICtrlCreateLabel("",350,50,100,20)
GUISetState()

Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
GUISetOnEvent($GUI_EVENT_CLOSE, "term")
GUICtrlSetOnEvent($button_for_func, "F1")
; таким образом, действия будут происходить лишь при нажатии на кнопки, получается что основной цикл свободен
While 1
WEnd

Func F1()
Run("func_1.exe", "")
Run("func_2.exe", "")
EndFunc

Func term()
Exit
EndFunc

HORRIBLE
16-09-2008, 21:49
Рысь, увы, но непомогло ( добавление объявки переменных спасло лишь от ошибки, но не более.
Но за изменение кода спасибо.

Creat0R
17-09-2008, 01:34
Смысл работы, как только я нажимаю кнопочку $button_for_func, два файлика func_1, func_2 должны запуститься и висеть в памяти и смотреть, что вписано в $input_for_func_1, $input_for_func_2 и в зависимости от того, что в них вписано выполнять те или иные предписания. »
Только немного непонятно, зачем 2 дополнительных файла тут? В любом случае, чуть ниже три файла, и ещё один, в которм совмещаются все три:


#include <GUIConstantsEx.au3>

HotKeySet("{ESC}", "Term")

GUICreate("My App", 1000, 700)

$Label_for_func_1 = GUICtrlCreateLabel("Sost func_1 ", 10, 10, 80, 20)
$Label_for_func_2 = GUICtrlCreateLabel("Sost func_2 ", 10, 50, 80, 20)

$Input_for_func_1 = GUICtrlCreateInput("0", 100, 10, 60, 20)
$Input_for_func_2 = GUICtrlCreateInput("0", 100, 50, 60, 20)

$Button_for_func = GUICtrlCreateButton("Turn on func_1 and 2", 170, 50, 150, 20)

$Label_from_func_1 = GUICtrlCreateLabel("", 350, 10, 100, 20)
$Label_from_func_2 = GUICtrlCreateLabel("", 350, 50, 100, 20)

GUISetState()

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button_for_func
Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptDir & '\Func_1.au3"', @ScriptDir)
Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptDir & '\Func_2.au3"', @ScriptDir)
EndSwitch
WEnd

Func Term()
Exit
EndFunc

#NoTrayIcon
$sTitle = "[CLASS:AutoIt v3 GUI;TITLE:My App]"

While 1
$sInput1_Text = ControlGetText($sTitle, "", "Edit1")

If $sInput1_Text = 1 Then
ControlSetText($sTitle, "", "Static3", "1-я задержка 5 с.")
Sleep(5000)
ControlSetText($sTitle, "", "Static3", "2-я задержка 2 с.")
Sleep(2000)
ControlSetText($sTitle, "", "Static3", "сост. 1")
Else
ControlSetText($sTitle, "", "Static3", "сост. 0")
EndIf

Sleep(100)
WEnd

$sTitle = "[CLASS:AutoIt v3 GUI;TITLE:My App]"

While 1
$sInput2_Text = ControlGetText($sTitle, "", "Edit2")

If $sInput2_Text = 1 Then
ControlSetText($sTitle, "", "Static4", "Задержка 10 с.")
Sleep(10000)
ControlSetText($sTitle, "", "Static4", "Сост. 1")
Else
ControlSetText($sTitle, "", "Static4", "Сост. 0")
EndIf

Sleep(100)
WEnd



#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)
HotKeySet("{ESC}", "_Quit")

Global $iCheckInputs = False
Global $iTimer_1 = -1, $iTimer_2 = -1, $iTimer_3 = -1

$hGUI = GUICreate("My App", 1000, 700)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Main_Events")

$Label_for_func_1 = GUICtrlCreateLabel("Sost func_1 ", 10, 10, 80, 20)
$Label_for_func_2 = GUICtrlCreateLabel("Sost func_2 ", 10, 50, 80, 20)

$Input_for_func_1 = GUICtrlCreateInput("0", 100, 10, 60, 20)
$Input_for_func_2 = GUICtrlCreateInput("0", 100, 50, 60, 20)

$Button_for_func = GUICtrlCreateButton("Turn on func_1 and 2", 170, 50, 150, 20)
GUICtrlSetOnEvent(-1, "_Main_Events")

$Label_from_func_1 = GUICtrlCreateLabel("", 350, 10, 100, 20)
$Label_from_func_2 = GUICtrlCreateLabel("", 350, 50, 100, 20)

GUISetState()

While 1
_CheckInputs()
Sleep(1000)
WEnd

Func _Main_Events()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
Exit
Case $Button_for_func
$iCheckInputs = Not $iCheckInputs
EndSwitch
EndFunc

Func _CheckInputs()
If Not $iCheckInputs Then Return

;Func_1.au3
If GUICtrlRead($Input_for_func_1) = 1 Then
If $iTimer_1 = -1 Then
GUICtrlSetData($Label_from_func_1, "1-я задержка 5 с.")
$iTimer_1 = TimerInit()
EndIf

If TimerDiff($iTimer_1) > 5000 Then
If $iTimer_2 = -1 Then
GUICtrlSetData($Label_from_func_1, "2-я задержка 2 с.")
$iTimer_2 = TimerInit()
EndIf

If TimerDiff($iTimer_2) > 2000 Then GUICtrlSetData($Label_from_func_1, "сост. 1")

If TimerDiff($iTimer_1) > 5000 And TimerDiff($iTimer_2) > 2000 Then
$iTimer_1 = -1
$iTimer_2 = -1
EndIf
EndIf
Else
GUICtrlSetData($Label_from_func_1, "сост. 0")
EndIf

;Func_2.au3
If GUICtrlRead($Input_for_func_2) = 1 Then
If $iTimer_3 = -1 Then
GUICtrlSetData($Label_from_func_2, "Задержка 10 с.")
$iTimer_3 = TimerInit()
EndIf

If TimerDiff($iTimer_3) > 10000 Then
GUICtrlSetData($Label_from_func_2, "Сост. 1")
$iTimer_3 = -1
EndIf
Else
GUICtrlSetData($Label_from_func_2, "Сост. 0")
EndIf
EndFunc

Func _Quit()
Exit
EndFunc

как окрашивать код в цвета Автоита при посте на форуме? »
См. утилиту Au3ToPost (http://creator-lab.ucoz.ru/load/3-1-0-18) :).

HORRIBLE
17-09-2008, 14:55
Creat0R, еще 2-ва файлика появились из-за незнания,т.к. я не знал как сделать, чтобы команды вополняли с задержкой без использования sleep, конечно догадывался, что наверно можно, даже срашивал тут про таймер в милисекундах, но дальше неполучилось продвинуться, опять таки из-за незнания ).

shyra1976
18-09-2008, 11:28
Мужики , кто знает как послать Chr(0x00) через функцию CommSendString и что бы AUTOIT оптеделяла что это "0"?




© OSzone.net 2001-2012