[Архив - Часть 1.3] AutoIt скрипты

Ответить
 • Просмотры: 6
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

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



Вместо использования звуков системы, я использовал её персонажа - старый добрый волшебник “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-ка тысяч строк.
Аватара пользователя
Sanja Alone

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Sanja Alone »

Я тоже игрался с msagent-ом. Мои наблюдения: Поскольку у различных персонажей разные действия, для обработки этой ситуации мне пришлось влепить Switch. А как бы вызывать действия случайным образом (ес-но имеющиеся у конкретного персонажа).Даже после Unload-а персонажа, в памяти продолжает висеть процесс AgentSvr.exe, к-рый занимает порядка 25-30Мб ОЗУ - это неприкольно, а убить процесс как-то некрасиво...Если агент был запущен из бесконечного цикла, то, пока он не будет Unload-ен, основной цикл стоит на паузе. В связи с этим возник вопрос о возможности реализации многопоточных задач посредстом AutoIt в целом.

Код:

Код: Выделить всё

#include 
#include 
$Path=@WindowsDir&"\MSAGENT\CHARS\"
$figures=_FileListToArray($Path,"*.acs",1)
;демонстрация
_msagent("Привет! Это просто тест")
Func _msagent($msg)
	If IsArray($figures) Then
		$P = $Path & $figures[Random(1,$figures[0],1)]
		$fig = StringMid($P,StringInStr($P,'\',0,-1)+1)
		$fig = StringLeft($fig,StringInStr($fig,".acs",0,-1)-1)
		If FileExists($P) Then
			$AgentControl = ObjCreate("Agent.Control.1")
			$SinkObject = ObjEvent($AgentControl, "event_")
			If Isobj($AgentControl) Then
				$AgentControl.Connected = True
				$AgentControl.Characters.Load($fig, $P)
				With $AgentControl.Characters($fig)
					.Show
					Switch StringLower($fig)
						Case 'offcat'
							.Play("Greeting")
							.Play("RestPose")
						Case 'dot'
							.Play("Greeting")
							.Play("RestPose")
						Case 'f1'
							.Play("Greeting")
							.Play("RestPose")
						Case 'logo'
							.Play("Greeting")
							.Play("RestPose")
						Case 'rocky'
							.Play("Greeting")
							.Play("RestPose")
						Case 'clippit'
							.Play("Congratulate")
							.Play("RestPose")
						Case 'mnature'
							.Play("Congratulate")
							.Play("RestPose")
						Case 'qmark'
							.Play("Welcome")
							.Play("RestPose")
						Case 'angel'
							.Play("Halo")
							.Play("Glow")
							.Play("Glowoff")
						Case 'blonde fem a'
							.Play("Blink")
							.Play("Wink")
							.Play("RestPose")
						Case 'candy'
							.Play("Blink")
							.Play("RestPose")
						Case 'max'
							.Play("Blink")
							.Play("RestPose")
						Case 'paige'
							.Play("Pointleftreturn")
						Case 'reaper'
							.Play("Smile")
							.Play("RestPose")
						Case 'scientist'
							.Play("Blackboard")
							.Play("Entropy")
							.Play("RestPose")
						Case 'sharky'
							;
						Case Else
							.Play("Greet")
							.Play("RestPose")
					EndSwitch
					While _KeyPressed()=0
						.MoveTo(Random(180,@DesktopWidth-180,1), Random(260,@DesktopHeight-260,1))
						.Speak($msg)
					WEnd
					.Hide
					.StopAll
				Endwith
				$AgentControl.Characters.Unload($fig)
			EndIf
		EndIf
	EndIf
EndFunc
Func _KeyPressed()
	Local $j
	Local $dll = DllOpen("user32.dll")
	For $j = 01 to 20
		If _IsPressed($j, $dll) Then
			DllClose($dll)
			Return 1
		EndIf
	Next
	DllClose($dll)
	Return 0
EndFunc
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

Creat0R


Цитата:



Что то никак не соображу как использовать Regshot.



Жмакаешь кнопку 1 снимок, потом делаешь изменения в системе (например ставишь галочку в или двигаешь ползунок), затем жмакаешь 2 снимок, затем сравнить.

Он сравнит состояния реестра до и после и выдаст изменения.
Аватара пользователя
Sanja Alone

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Sanja Alone »

Creat0R


Цитата:



Можно занести эти действия в массив, и перебирать его по Random



Это не прикольно, гораздо практичнее получать список действий персонажа программно. Вот в чем вопрос... "желательно средствами AutoIt'а выявить список действии для указанного персонажа" Изображение




Цитата:



А что, при использовании Switch учитывается регистр букв?



Только что проверил - не учитывается. Можно StringLower убрать.




Цитата:



Я написал функцию которая собирает в массив пути к этим персонажам



У меня так тоже сделано, причем с учетом персонажей в директориях Офиса, но это уже явный перебор Изображение




Цитата:



Как можно, и можно ли вообще, регулировать скорость произношения речи?





Код:

Код: Выделить всё

[HKEY_CURRENT_USER\Software\Microsoft\Speech\Voices]
;низкая
"DefaultTTSRate"=dword:FFFFFFF6
;средняя
"DefaultTTSRate"=dword:00000000
;высокая
"DefaultTTSRate"=dword:0000000a

Ну, и промежуточные значения есть, ес-но. Посмотри regshot-ом.
Аватара пользователя
Sancho111

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Sancho111 »

привет, в общем такая проблемка, нужно чтобы в этом скрипте перед Send ( 'Иванов' )

раскладка менялась на русскую

а перед Send ( 'Ivanov@f57.nalog.ru' ) на англискую

заранее спасибо



Код:

Код: Выделить всё

;   Автоматическое заполнение квитанции
;  ========================================
Run ( 'fap2006.exe' )
WinWaitActive ( 'Редактор актов приёма ПО' )
WinWaitActive ( 'Открыть' )
WinWaitActive ( 'Редактор актов приёма ПО', 'Акт приёма' )
Send ( '{Tab}' )
Send ( '9977' )
AutoItSetOption ( "SendKeyDelay", 20 )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( 'Иванов' )
AutoItSetOption ( "SendKeyDelay", 20 )
Send ( '{Tab}' )
Send ( 'Александр' )
AutoItSetOption ( "SendKeyDelay", 20 )
Send ( '{Tab}' )
Send ( 'Сергеевич' )
AutoItSetOption ( "SendKeyDelay", 20 )
Send ( '{Tab}' )
Send ( '913-08-24' )
AutoItSetOption ( "SendKeyDelay", 20 )
Send ( '{Tab}' )
Send ( 'Ivanov@f57.nalog.ru' )
AutoItSetOption ( "SendKeyDelay", 20 )
Exit
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

Sancho111

FAQ
-> Как с помощью AutoIt сменить раскладку клавиатуры -> WinAPI-метод
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

Sanja Alone

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



Там есть функция которая возвращает массив всех действии для заданного персонажа, и даже больше, там есть функции позволяющие добавлять/удалять действия в контекстное меню персонажа (по правой кнопке мышки на нём).



В общем я в эйфории! Изображение




Цитата:



Ну, и промежуточные значения есть, ес-но. Посмотри regshot-ом.



Спасибо за направление, а что это за regshot? не слышал о нём, и как посмотреть? т.е как получить промежуточные значения? (жалко что нельзя просто цифрами задавать Изображение )





А функция для получения списка действии персонажа вот (довольно проста оказалась) :





Код:

Код: Выделить всё

Func _MAListCharAnimations( ByRef $oCharacter )
    Local $RetVal[1]
    $RetVal[0] = 0
    If IsObj( $oCharacter ) Then
        For $AnimName in $oCharacter.AnimationNames
            Redim $RetVal[ Ubound( $RetVal ) + 1 ]
            $RetVal[0] = Ubound( $RetVal ) - 1
            $RetVal[$RetVal[0]] = $AnimName
        Next
    EndIf
    Return $RetVal
EndFunc

$oCharacter естественно должен передаваться как объект загрузки персонажа.
Аватара пользователя
Sancho111

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Sancho111 »

Creat0R


Цитата:



что это за regshot?



RegShot (редакция ParaGlider-а)





Цитата:



жалко что нельзя просто цифрами задавать



Можно. Представь себе координатную ось с 21 координатой (10 отрицательных, ноль и 10 положительных):



Код:

Код: Выделить всё

FFFFFFF6 - минимальное значение
FFFFFFF7
...
FFFFFFFF
00000000 - 0 (начало координат)
00000001
...
00000009
0000000a - максимальное значение
Аватара пользователя
Sancho111

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Sancho111 »

Код:

Код: Выделить всё

;   Автоматическое заполнение квитанции
;  ========================================
;клавиши (разрешенные клавиши: 1,2,3,4,5,6,7,8,9,0,~,Ё - знак ударения)
$vrtkey='1,2'
;модификаторы клавиш (разрешены: '05' - Ctrl;)
$keymod='05,05'
;коды языков (можете посмотреть в разделе "Appendix" руководства по AutoIt или в вышеприведенном примере)
$lang='0409,0419'
;включаем возможность раздельного переключения языков (англ. - Ctrl+Shift+1; рус. - Ctrl+Shift+2;)
_EnableLangSwitching($vrtkey,$keymod,$lang)
Run ( 'fap2006.exe' )
WinWaitActive ( 'Редактор актов приёма ПО' )
WinWaitActive ( 'Открыть' )
WinWaitActive ( 'Редактор актов приёма ПО', 'Акт приёма' )
Sleep(500)
;переключение на рус.
Send('^+2')
Send ( '{Tab}' )
Send ( '9977' )
AutoItSetOption ( "SendKeyDelay", 20 )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( 'Иванов' )
AutoItSetOption ( "SendKeyDelay", 20 )
Send ( '{Tab}' )
Send ( 'Александр' )
AutoItSetOption ( "SendKeyDelay", 20 )
Send ( '{Tab}' )
Send ( 'Сергеевич' )
AutoItSetOption ( "SendKeyDelay", 20 )
Send ( '{Tab}' )
Send ( '913-08-24' )
AutoItSetOption ( "SendKeyDelay", 20 )
Send ( '{Tab}' )
;переключение на англ.
Send('^+1')
Send ( 'Ivanov@f58.nalog.ru' )
AutoItSetOption ( "SendKeyDelay", 20 )
;отключение возможности раздельного переключения языков (удаление из реестра внесенных туда веток)
;в кач-ве аргумента укажите к-во языков, заданное выше в переменной $lang (для данного примера. - 3)
_DisableLangSwitching(3)
Func _EnableLangSwitching($key,$mod,$lng)
$constpart="HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\000001"
$akey=StringSplit($key,',',1)
$amod=StringSplit($mod,',',1)
$alng=StringSplit($lng,',',1)
If UBound($akey,1)=UBound($amod,1) and UBound($akey,1)=UBound($alng,1) Then
        For $i=1 To UBound($alng,1)-1
                RunWait('REG ADD "' & $constpart & StringFormat('%02s"',$i-1) & ' /v "Virtual Key" /t REG_BINARY /d ' & Hex(Asc($akey[$i]),2) & '000000 /f','',@SW_HIDE)
                RunWait('REG ADD "' & $constpart & StringFormat('%02s"',$i-1) & ' /v "Key Modifiers" /t REG_BINARY /d ' & $amod[$i] & 'c00000 /f','',@SW_HIDE)
                RunWait('REG ADD "' & $constpart & StringFormat('%02s"',$i-1) & ' /v "Target IME" /t REG_BINARY /d ' & StringRight($alng[$i],2)&StringLeft($alng[$i],2)&StringRight($alng[$i],2)&StringLeft($alng[$i],2) & ' /f','',@SW_HIDE)
        Next
        SetError(0)
        Return(1)
Else
        SetError(1)
        Return(0)
EndIf
EndFunc
Func _DisableLangSwitching($count)
$constpart="HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\000001"
For $i=0 To $count-1
        RunWait('REG DELETE "' & $constpart & StringFormat('%02s"',$i) & ' /f','',@SW_HIDE)
Next
EndFunc
Exit

выдает ошибку

$akey=StringSplit($key,',',1)

$akey=^ERROR

Error: Incorect number of parametrs in function call
Аватара пользователя
Sancho111

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Sancho111 »

Sancho111

Я же говорил о методе "WinAPI"



Код:

Код: Выделить всё

Run ( 'fap2006.exe' )
AutoItSetOption ( "SendKeyDelay", 20 )
WinWaitActive ( 'Редактор актов приёма ПО' )
WinWaitActive ( 'Открыть' )
WinWaitActive ( 'Редактор актов приёма ПО', 'Акт приёма' )
$hWnd = WinGetHandle ( 'Редактор актов приёма ПО', 'Акт приёма' )
Send ( '{Tab}' )
Send ( '9977' )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( '{Tab}' )
Send ( '{Tab}' )
_SetKeyboardLayout("00000419", $hWnd)
Send ( 'Иванов' )
Send ( '{Tab}' )
Send ( 'Александр' )
Send ( '{Tab}' )
Send ( 'Сергеевич' )
Send ( '{Tab}' )
Send ( '913-08-24' )
Send ( '{Tab}' )
_SetKeyboardLayout("00000409", $hWnd)
Send ( 'Ivanov@f57.nalog.ru' )
Func _SetKeyboardLayout($sLayoutID, $hWnd)
Local $WM_INPUTLANGCHANGEREQUEST = 0x50
Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $ret[0])
EndFunc
Ответить

Вернуться в «AutoIt»