Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты

Закрытая тема
Настройки темы
[Архив - Часть 1.3] AutoIt скрипты

Старожил


Сообщения: 250
Благодарности: 16

Профиль | Отправить PM | Цитировать


Изменения
Автор: Vadikan
Дата: 25-01-2008
Внимание!
Тема переведена в архивное состояние





(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.

Помогите пожалуйста. Нужен маленький скриптик для решения некоторых рутинных задачь.
Вот что нужно сделать последовательно:

1) в папке DIR1 находим и удаляем файлы в названии которых присутствует text_1
2) в папке DIR2 находим xxx.sif и удаляем строки, в которых присутствует text_1
3) в папке DIR3 находим xxx.inf и добавляем в его секцию [XXX] несколько строчкек (text_2, text_3, ..., text_n)
4) в папке DIR4 находим yyy.inf ищем в его секции [YYY] text_4 и заменяем его на text_5
5) сохраняем все изменения и выводим отчёт о проделанной работе :-)

Заранее благодарен.

Отправлено: 05:05, 03-12-2006

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Diamond
Ты как то спрашивал про то, как заставить гуи НЕ отображать системны стиль, так вот я нашел на офф. форуме решение этой задачки...

Это простой скачивальщик (не знаю на сколько он полезен), при его запуске задаётся стиль как в старых/без стильных виндоус.
Вот ссылка, я немного переделал, так как там не совсем весь гуи был таким стилем, я даже удивился, как окно от FileSelectFolder() приняло старый (не)стиль - видимо и всё остальное что будет использованно в гуи будет иметь подобный стиль.
Я не разбирался как оно работает, но видимо там упорно используются Dll'овские штучки

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:52, 08-03-2007 | #261



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27
Тоже на офф. форуме нашел функцию для слежения за бездельем юзера (немного переделал для примера) :

Код: Выделить весь код
Dim $i_LastActive = _LastActive()

$TimeInit = TimerInit()
While 1
     If $i_LastActive <> _LastActive() Then ExitLoop
     Sleep(100)
WEnd

MsgBox(64, "Activity Test", "You was not active <" & Round(TimerDiff($TimeInit)/1000, 1) & "> second(s)")

 Func _LastActive($v_User32Dll = 'user32.dll')
    Local $str_LastInput = DllStructCreate('uint;dword')
    DllStructSetData($str_LastInput, 1, DllStructGetSize($str_LastInput))
    DllCall($v_User32Dll, 'int', 'GetLastInputInfo', 'ptr', DllStructGetPtr($str_LastInput))
    Return DllStructGetData($str_LastInput, 2)
EndFunc
Я давно искал подобное, мне нужно было проверить, была ли нажата какая либо клавиша, или кнопка мышки, и это идеально подходит!

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:12, 08-03-2007 | #262


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
По PID вроде не работает
да не, вроде работает если PID передавать не строкой, а числом
Цитата:
я пытаюсь написать утилитку менеджер процессов
в таком случае эффективней выполнять запрос не по отдельным процессам, а сразу по всему списку, вот вариант ProcessList, который кроме PID и Name выводит дополнительно инфу по загрузке CPU:
Код: Выделить весь код
$a = _ProcessList ('')
If IsArray ($a) Then
    For $i=0 To $a[0][0]
        ConsoleWrite (StringFormat('%4i', $a[$i][0]) & ' : ' & StringFormat('%02i', $a[$i][2]) & ' : ' & $a[$i][1] & @CRLF)
    Next
EndIf

Func _ProcessList ($name = '', $ticks = 1000)
    Local $arrWork[1][3] = [[0,0,0]], $arrMain[1][3] = [[0,'_Summary',0]]
    Local $i, $colItems, $objItem, $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2"), $where = 'WHERE IDProcess>0'
    If $name <> '' Then $where &= ' AND Name=' & '"' & $name & '"'
    ; Считываем необходимые характеристики процессов - попытка №1
    $colItems = $objWMIService.ExecQuery ("SELECT IDProcess,PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfRawData_PerfProc_Process " & $where, "WQL", 0x30)
    For $objItem In $colItems
        $arrWork[0][0]+=1
        ReDim $arrWork[$arrWork[0][0]+1][3]
        $arrWork[$arrWork[0][0]][0]=$objItem.IDProcess
        $arrWork[$arrWork[0][0]][1]=$objItem.PercentProcessorTime
        $arrWork[$arrWork[0][0]][2]=$objItem.Timestamp_Sys100NS
    Next
    If $arrWork[0][0]=0 Then Return ''
    ; Накапливаем статистику...
    Sleep ($ticks)
    ; Считываем необходимые характеристики процессов - попытка №2
    $colItems = $objWMIService.ExecQuery ("SELECT IDProcess,PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfRawData_PerfProc_Process " & $where, "WQL", 0x30)
    For $objItem In $colItems
        For $i=1 To $arrWork[0][0]
            If $arrWork[$i][0]=$objItem.IDProcess Then
                $arrMain[0][0]+=1
                ReDim $arrMain[$arrMain[0][0]+1][3]
                $arrMain[$arrMain[0][0]][0]=$objItem.IDProcess
                $arrMain[$arrMain[0][0]][1]=$objItem.Name
                $arrMain[$arrMain[0][0]][2]=Round(100*($arrWork[$i][1]-$objItem.PercentProcessorTime)/($arrWork[$i][2]-$objItem.Timestamp_Sys100NS))
                $arrMain[0][2]+=$arrMain[$arrMain[0][0]][2]
            EndIf
        Next
    Next
    If $arrMain[0][2]>100 Then $arrMain[0][2]=100
    Return $arrMain
EndFunc
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:06, 09-03-2007 | #263


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
на офф. форуме нашел функцию для слежения за бездельем юзера
мне свой вариант нравится больше, т.к. позволяет отслеживать не только начало, но и конец бездействия.... кстати можно использовать для хранителей экрана
Код: Выделить весь код
#include <Date.au3>

$IdleMinimum = 5000 ; допустимый период неактивности в миллисекундах

While 1
    $iIdle = _IdleWaitStart ($IdleMinimum)
    ConsoleWrite (_Now () & ' ' & @UserName & ' неактивен уже ' & _TickToTimeString ($iIdle) & @CRLF)
    $iIdle = _IdleWaitCommit($IdleMinimum)
    ConsoleWrite (_Now () & ' ' & @UserName & ' был неактивен ' & _TickToTimeString ($iIdle) & @CRLF)
Wend

; Ожидание начала бездействия пользователя.
; Возвращает время неактивности (в тиках)
; $idlesec - минимальная длительность ожидаемой неактивности (в тиках)
Func _IdleWaitStart ($idlesec)
    Local $aRet, $iSave, $iTick, $LastInputInfo = DllStructCreate ("uint;dword")
    DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
    DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Do
        Sleep(200)
        $iSave= DllStructGetData ($LastInputInfo, 2)
        DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
        $aRet = DllCall ("kernel32.dll", "long", "GetTickCount")
    Until ($aRet[0] - DllStructGetData ($LastInputInfo, 2))> $idlesec
    Return $aRet[0] - DllStructGetData ($LastInputInfo, 2)
EndFunc

; Ожидание окончания бездействия пользователя.
; Возвращает время неактивности в (тиках)
; $idlesec - минимальная длительность ожидаемой неактивности в (тиках)
Func _IdleWaitCommit ($idlesec)
    Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
    DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
    DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Do
        $iSave = DllStructGetData ($LastInputInfo, 2)
        Sleep(200)
        DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec
    Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc

Func _TickToTimeString ($iTicks)
    Local $iHours, $iMins, $iSecs, $sText = ''
    _TicksToTime  ($iTicks, $iHours, $iMins, $iSecs)
    If $iHours Then $sText = $iHours & ' часов '
    If $iMins  Then $sText = $sText & $iMins & ' минут '
    If $iSecs  Then $sText = $sText & $iSecs & ' секунд'
    If $sText = '' Then $sText = 'меньше секунды'
    Return $sText
EndFunc

Последний раз редактировалось amel27, 09-03-2007 в 04:04.


Отправлено: 03:25, 09-03-2007 | #264


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27
Цитата:
работает если PID передавать не строкой, а числом
Строкой в смысле String'ом ? я из переменной передаю, но переменная содержит непосредственно цифри (это PID берётся из списка прцессов в ListView)... но как выяснилось, берутся не только цифры(?), я подставил Number($Pid) и всё нормально определяется... мистика...

Цитата:
в таком случае эффективней выполнять запрос не по отдельным процессам, а сразу по всему списку
100% согласен, но у меня с этим проблема - у меня уже считывается список в ListView, и при обновлении этого списка, нужно обновлять только колонку с загрузкой ЦП, т.к весь список обновлять слишком долго (для обновления списка в случае отсутствия/добавления процесса, идёт отдельная проверка, где сравнивается список существующих процессов и список процессов в ListView, если найдены различия, то обновляется всё).

Цитата:
мне свой вариант нравится больше
Мне тоже (твой) - интересно, можно на его основе, сделать запись статистики? т.е к примеру, указать промежуток слежения за юзером (можно из InputBox() или ещё лучше, GUI нарисовать с отображением графика даты и времени), допустим в течении 24-ёх часов, и накапливать в переменную (а лучше в массив) данные, А) о том сколько юзер был не активен (в течении этого времени, т.е 24-ёх часов), и Б) сколько юзер был активен - данные чтобы возвращались в поноценном формате времени (по необходимости и даты)... я попробовал что-то подбное сделать, но безуспешно... могу выложить мои безнадёжные попытки если нужно (там уже гуик нарисован)

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 21:17, 09-03-2007 | #265


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
PID берётся из списка прцессов в ListView
значит нужно передавать значение переменной, обработанное ф-цией Number()

Цитата:
100% согласен, но у меня с этим проблема - у меня уже считывается список в ListView
Имхо лучше ввести пару рабочих массивов со списками процессов, которые бы поочередно (целиком) обновлялись WMI-запросами, и на основании сравнения этих массивов определять какие GUI-элементы необходимо обновить...

Цитата:
интересно, можно на его основе, сделать запись статистики?
не вижу препятствий, например можно вести два массива - с информаций об активности и о бездействии: начало, конец и длительность временного периода... останется только решить в каком виде представлять содержимое массивов
Код: Выделить весь код
#include <Date.au3>

$IdleMinimum = 5000 ; Minimum inactivity in seconds

Dim $arrUserActive[1][3]=[[0,0,0]]
Dim $arrUserInactive[1][3]=[[0,0,0]]
While 1
    $arrUserActive[0][0]+=1
    ReDim $arrUserActive[$arrUserActive[0][0]+1][3]
    $arrUserActive[$arrUserActive[0][0]][0]=_Now ()
    $iIdle = _IdleWaitStart ($IdleMinimum)
    $arrUserActive[$arrUserActive[0][0]][1]=_Now ()
    $arrUserActive[$arrUserActive[0][0]][2]=_TickToTimeString($iIdle)
    ConsoleWrite ("Записей активности: " & $arrUserActive[0][0] & @TAB & "Записей нективности: " & $arrUserInactive[0][0] & @CRLF)

        $arrUserInactive[0][0]+=1
    ReDim $arrUserInactive[$arrUserInactive[0][0]+1][3]
    $arrUserInactive[$arrUserInactive[0][0]][0]=_Now ()
    $iIdle = _IdleWaitCommit($IdleMinimum)
    $arrUserInactive[$arrUserInactive[0][0]][1]=_Now ()
    $arrUserInactive[$arrUserInactive[0][0]][2]=_TickToTimeString($iIdle)
    ConsoleWrite ("Записей активности: " & $arrUserActive[0][0] & @TAB & "Записей нективности: " & $arrUserInactive[0][0] & @CRLF)
Wend
З.Ы.это только пример - для графического представления потребуется числовое представление интервалов а не текст

Отправлено: 07:20, 11-03-2007 | #266


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27
Цитата:
значит нужно передавать значение переменной, обработанное ф-цией Number()
Я так и делаю (уже)...
Цитата:
я подставил Number($Pid) и всё нормально определяется
Цитата:
Имхо лучше ввести пару рабочих массивов со списками процессов, которые бы поочередно (целиком) обновлялись WMI-запросами, и на основании сравнения этих массивов определять какие GUI-элементы необходимо обновить...
Не так то всё просто, ещё нужно сравнивать какой именно элемент в списке соответствует элементу массива, а иногда в списке могут быть (и будут) одинаковые имена процессов, что может вызвать конфиликты... естественно можно сравнивать по PID, но всё же всё это для меня пока ещё смутно... нужно немного поламать голову

Цитата:
не вижу препятствий
Знаю, а вот я вижу... присмотревшись к твоему примеру, у меня началась голова кружится... я понимаю (с трудом) двумерный массив, а трёхмерный массив у меня вызывает желание закрыть побыстрее SciTE

Я пока остановлюсь на простеньком... я сделал типа юмористичесукую напоминалку для бездельника - вот код:

Код: Выделить весь код
HotKeySet("^e", "Quit")
TraySetIcon("shell32.dll", 111)
TraySetToolTip("Laziness Detecter (!)")

$Idle = 0
$MinLaziness = 10
$MaxLaziness = 60
$LazyLimit = Random($MinLaziness, $MaxLaziness, 1)
$TimeStamp = TimerInit()
AdlibEnable("CheckLaziness", 10)

While 1
    $Idle = _IdleWaitCommit(0)
    TrayTip("", "", 0)
    $TimeStamp = TimerInit()
    $Idle = 0
WEnd

Func CheckLaziness()
    $TimeDiff = Round(TimerDiff($TimeStamp)/1000)
    If $TimeDiff > $LazyLimit And $Idle = 0 Then
        TrayTip("You are lazy", "You are been lazy for a long time (" & _SecsToTime($TimeDiff, ":") & ")", 5, 1)
        $TimeStamp = TimerInit()
        $LazyLimit = Random($MinLaziness, $MaxLaziness, 1)
    EndIf
    If $TimeDiff >= ($LazyLimit/2) Then TrayTip("", "", 0)
EndFunc

Func _SecsToTime($iTicks, $Delim)
    If Number($iTicks) >= 0 Then
        $iHours = Int($iTicks / 3600)
        $iTicks = Mod($iTicks, 3600)
        $iMins = Int($iTicks / 60)
        $iSecs = Round(Mod($iTicks, 60))
        If StringLen($iHours) = 1 Then $iHours = "0" & $iHours
        If StringLen($iMins) = 1 Then $iMins = "0" & $iMins
        If StringLen($iSecs) = 1 Then $iSecs = "0" & $iSecs
        $Time = $iHours & $Delim & $iMins & $Delim & $iSecs
        Return $Time
    Else
        SetError(1)
        Return 0
    EndIf
EndFunc

Func _IdleWaitCommit($idlesec)
    Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
    DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
    DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Do
        $iSave = DllStructGetData ($LastInputInfo, 2)
        Sleep(200)
        DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec
    Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc

Func Quit()
    Exit
EndFunc
Можно задать минимум и максимум ($MinLaziness = 10 и $MaxLaziness = 60 - в секундах) время в течении которого будет считаться что юзер бкездельник
Будет перебираться случайный промежуток времени, и выскакивать треевская подсказака с напоминанием о том сколько времени пользователь ничего не делал.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 07:56, 11-03-2007 | #267


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
трёхмерный массив у меня вызывает желание закрыть побыстрее SciTE
тут кажись только двумерные...
Цитата:
Не так то всё просто, ещё нужно сравнивать какой именно элемент в списке соответствует элементу массива, а иногда в списке могут быть (и будут) одинаковые имена процессов, что может вызвать конфиликты... естественно можно сравнивать по PID, но всё же всё это для меня пока ещё смутно... нужно немного поламать голову
может этот пример поможет:
Код: Выделить весь код
#include <array.au3>

$b = _ProcessList ()
While 1
    Sleep (1000)
    Dim $a = $b
    $b = _ProcessList ()
    _CompProcList ($a, $b)
Wend

Func _CompProcList (ByRef $a, ByRef $b)
    Local $i
    Local $a1[$a[0][0]+1], $a2[$a[0][0]+1], $b1[$b[0][0]+1], $b2[$b[0][0]+1]
    If $a[0][0] Then
        ; индексируем массив $a
        For $i=1 To $a[0][0]
            $a1[$i]=$a[$i][0] & $a[$i][1] ; PID и имя процесса
            $a2[$i]=$a[$i][0] & $a[$i][1] & $a[$i][2] ; PID, имя процесса и ЦП
        Next
        ; индексируем массив $b
        For $i=1 To $b[0][0]
            $b1[$i]=$b[$i][0] & $b[$i][1] ; PID и имя процесса
            $b2[$i]=$b[$i][0] & $b[$i][1] & $b[$i][2] ; PID, имя процесса и ЦП
        Next
        ; Сравниваем новый массив ($b) со старым ($a)
        For $i=1 To $b[0][0]
            $f1 = _ArraySearch($a1, $b1[$i], 1)
            $f2 = _ArraySearch($a2, $b2[$i], 1)
            If $f1<0 Then
                ConsoleWrite('Новый процесс: ' & StringFormat ('%4.0i',$b[$i][0]) & ' : ' & $b[$i][1] & @CRLF)
            ElseIf $f1>0 And $f2<0 Then
                ConsoleWrite('Изменилась загрузка ЦП: ' & StringFormat ('%4.0i',$b[$i][0]) & ' : ' & StringFormat ('%02i',$a[$f1][2]) & ' > ' & StringFormat ('%02i',$b[$i][2]) & ' : ' & $b[$i][1] & @CRLF)
            EndIf
        Next
        ; Сравниваем старый массив ($a) с новым ($b)
        For $i=1 To $a[0][0]
            $f1 = _ArraySearch($b1, $a1[$i], 1)
            If $f1<0 Then
                ConsoleWrite('Исчез процесс: ' & StringFormat ('%4.0i',$a[$i][0]) & ' : ' & $a[$i][1] & @CRLF)
            EndIf
        Next
    EndIf
EndFunc
Цитата:
сделал типа юмористичесукую напоминалку для бездельника
забавно, хотя Random имхо лишний... по крайней мере для бездельника
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:53, 11-03-2007 | #268


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27
Цитата:
тут кажись только двумерные
Упс.. точно... но тоже путает (особенно подстановка самого массива в элемент этого же массива в каждом месте ).

Цитата:
может этот пример поможет:
О! это точно поможет, попробую его адаптировать в утилитку. Спасибо!

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

Кстати, я вот ещё что придумал... заносим в массив (можно из файла) разные сообщения (с разной характеристикой и контекстом), и тоже случайным перебором выводим в TrayTip'е, а также можно занести в массив все файлы из папки мелодии Windows - C:\windows\media (можно даже свою папку с мелодиями указать), и тоже в момент вывода сообщения случайно (в смысле в случайном порядке ) их проигрывать...

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 12:33, 11-03-2007 | #269


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Ура!!! я это сделал, немного помучался, но всё же сделал!

Вместо использования звуков системы, я использовал её персонажа - старый добрый волшебник “Merlin” ...

Если в системе не найден персонаж, то выводится TrayTip. А и ещё, чтобы персонаж ещё и говорил, в системе должен быть установлен голосовой движёк.

При простое более 5-ти секунд, иконка трея меняется на неактивного юзера, при активности иконка обратно меняется на что-то вроде юзера в движении (не смог в системе найти более походящей иконки).

Также при простое в переменную $TotalTime накапливается общее время простоя (секунды), а при активности эта переменная сбрасывается на ноль (0)...
Также удалось заносить в массив отдельные заготовки сообщении, если есть файл сообщении (LazyMessages.dat), то с него считываются строки, если его нет, то в скрипте уже заготовлены 10 сообщении (на английском)...
Для выхода из скрипта в любое время, нужно нажать Ctrl E (при английской раскладке).

В общем, на мой взгляд получилось довольно неплохо... правда есть пару моментов, например, как можно проверить закончил ли персонаж читать текст, и соответственно убить его? ... вот скрипт:

Код: Выделить весь код
HotKeySet("^e", "Quit")
TraySetIcon("shell32.dll", 160)
TraySetToolTip("Laziness Detecter (!)")

Dim $MessagesArr[11]
$MessagesArr[0] = 10
$MessagesArr[1] = "You are been lazy for a long time <%n>"
$MessagesArr[2] = "This is enough, start doing something >:( - you are lazy to much (%n)"
$MessagesArr[3] = "Hello!? Any one is home? why you are so lazy so long time? <%n> do somthing!"
$MessagesArr[4] = "Hi! Don't you fill like cow? Laziness is reason number 1 of why people die"
$MessagesArr[5] = "It's been over a <%n> time sense you touch your computer, touch it now!"
$MessagesArr[6] = "I can not wait for you so long (%n), I am going to shutdown myself.... beep.. beeep.. beeeeeep"
$MessagesArr[7] = "Hey man, are you forgot about me? Fine! I want to divorced"
$MessagesArr[8] = "You have no check your email for <%n> time, maybe there something intersteing?"
$MessagesArr[9] = "There is a virus on your computer! (it exists there for a long time <%n>) perform virus checking immediately!"
$MessagesArr[10] = "Hi! What's up dog? Don't pay attention; I am just stupid character that doesn't need attention! >:("

$MessagesFile = "LazyMessages.dat"
If FileExists($MessagesFile) And FileRead($MessagesFile) <> "" Then $MessagesArr = StringSplit(FileRead($MessagesFile), @LF)

$Idle = 0
$TotalTime = 0
$MinLaziness = 10
$MaxLaziness = 60
$LazyLimit = Random($MinLaziness, $MaxLaziness, 1)
$TimeStamp = TimerInit()

AdlibEnable("CheckLaziness", 10)

While 1
	$Idle = _IdleWaitCommit(0)
	TraySetIcon("shell32.dll", 160)
	TrayTip("", "", 0)
	$TimeStamp = TimerInit()
	$Idle = 0
	$TotalTime = 0
WEnd

Func CheckLaziness()
	$TimeDiff = Round(TimerDiff($TimeStamp)/1000)
	If $TimeDiff > $LazyLimit And $Idle = 0 Then
		TraySetIcon("shell32.dll", 111)
		$TotalTime += $TimeDiff
		$LazyTime = _SecsToTime($TotalTime, ":")
		$TextToSay = StringReplace($MessagesArr[Random(1, $MessagesArr[0], 1)], "%n", $LazyTime)
		$SleepTime = Round((StringLen($TextToSay)/7)*1000)
		If StringLen($TextToSay) < 7 Then $SleepTime = 5000
		CharacterMsg($TextToSay, Random(100, @DesktopWidth-100, 1), Random(10, @DesktopHeight-150, 1), $SleepTime)
		If @error Then TrayTip("You are lazy", $TextToSay, 5, 1)
		$LazyLimit = Random($MinLaziness, $MaxLaziness, 1)
		$TimeStamp = TimerInit()
	EndIf
	If $TimeDiff >= ($LazyLimit/2) Then TrayTip("", "", 0)
	If $TimeDiff >= 5 And $LazyLimit > 5 Then TraySetIcon("shell32.dll", 111)
EndFunc

Func _SecsToTime($iTicks, $Delim)
	If Number($iTicks) >= 0 Then
		$iHours = Int($iTicks / 3600)
		$iTicks = Mod($iTicks, 3600)
		$iMins = Int($iTicks / 60)
		$iSecs = Round(Mod($iTicks, 60))
		If StringLen($iHours) = 1 Then $iHours = "0" & $iHours
		If StringLen($iMins) = 1 Then $iMins = "0" & $iMins
		If StringLen($iSecs) = 1 Then $iSecs = "0" & $iSecs
		$Time = $iHours & $Delim & $iMins & $Delim & $iSecs
		Return $Time
	Else
		SetError(1)
		Return 0
	EndIf
EndFunc

Func _IdleWaitCommit($idlesec)
    Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
    DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
    DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Do
        $iSave = DllStructGetData ($LastInputInfo, 2)
        Sleep(200)
        DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec
    Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc

Func CharacterMsg($TextToSay, $MovexX=200, $MoveY=200, $Sleep=5000)
	$figure = "merlin"
	If $TextToSay = "" Then $TextToSay = "Oops! there was an Error!"
	$Path = @WindowsDir & "\MSAGENT\CHARS\merlin.acs"
	If Not FileExists($Path) Then Return SetError(1)
	$AgentControl = ObjCreate("Agent.Control.1") 
	$SinkObject=ObjEvent($AgentControl, "event_") 
	If Isobj($AgentControl) Then $AgentControl.Connected = True
	$AgentControl.Characters.Load($figure, $Path) 
	$A = $AgentControl.Characters($figure) 
	$A.MoveTo($MovexX, $MoveY, 0)
	$A.Show
	$A.Speak($TextToSay)
	$A.Play("Greet") 
	$A.Play("RestPose")
	Sleep($Sleep)
	$A.Hide
	$A.StopAll
	$AgentControl.Characters.Unload($figure)
EndFunc

Func Quit()
	Exit
EndFunc
P.S
Скрипт чёрно-белый потому как в разукрашенном виде он занимает более 40-ка тысяч строк.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 17:28, 11-03-2007 | #270



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? DreDo Хочу все знать 4 01-12-2009 18:54
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. Vadikan AutoIt 1543 18-01-2009 10:46
[архив - Часть 2] AutoIt скрипты Vadikan AutoIt 985 21-01-2008 09:58
[Архив - Часть 1.2] AutoIt скрипты Dirk Diggler AutoIt 505 02-12-2006 11:00
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход