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

Компьютерный форум 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

 

Аватара для Sanja Alone

Ищу Человека…


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

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


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

$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

-------
Sanja Alone's site (ConvRegToAU3, OEsr, RSA, AutoIt скрипты)

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

Отправлено: 17:16, 12-03-2007 | #271



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

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


Аватара для Creat0R

Must AutoIt


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

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


Sanja Alone
Цитата:
Поскольку у различных персонажей разные действия, для обработки этой ситуации мне пришлось влепить Switch. А как бы вызывать действия случайным образом (ес-но имеющиеся у конкретного персонажа).
Можно занести эти действия в массив, и перебирать его по Random (я также в примере сократил немного Switch ) :

Код: Выделить весь код
				With $AgentControl.Characters($fig)
					.Show
					Switch StringLower($fig)
						Case 'offcat', 'dot', 'logo', 'rocky'
							$PlayArr = StringSplit("Greeting|RestPose", "|")
							.Play($PlayArr[Random(1, $PlayArr[0], 1)])
						Case 'clippit', 'mnature'
							$PlayArr = StringSplit("Congratulate|RestPose", "|")
							.Play($PlayArr[Random(1, $PlayArr[0], 1)])
						Case 'qmark'
							$PlayArr = StringSplit("Welcome|RestPose", "|")
							.Play($PlayArr[Random(1, $PlayArr[0], 1)])
						Case 'angel'
							$PlayArr = StringSplit("Halo|Glow|Glowoff", "|")
							.Play($PlayArr[Random(1, $PlayArr[0], 1)])
						Case 'blonde fem a'
							$PlayArr = StringSplit("Blink|Wink|RestPose", "|")
							.Play($PlayArr[Random(1, $PlayArr[0], 1)])
						Case 'candy', 'max'
							$PlayArr = StringSplit("Blink|RestPose", "|")
							.Play($PlayArr[Random(1, $PlayArr[0], 1)])
						Case 'paige'
							.Play("Pointleftreturn")
						Case 'reaper'
							$PlayArr = StringSplit("Smile|RestPose", "|")
							.Play($PlayArr[Random(1, $PlayArr[0], 1)])
						Case 'scientist'
							$PlayArr = StringSplit("Blackboard|Entropy|RestPose", "|")
							.Play($PlayArr[Random(1, $PlayArr[0], 1)])
						Case 'sharky'
							;
						Case Else
							$PlayArr = StringSplit("Greet|RestPose", "|")
							.Play($PlayArr[Random(1, $PlayArr[0], 1)])
					EndSwitch
					While _KeyPressed()=0
						.MoveTo(Random(180,@DesktopWidth-180,1), Random(260,@DesktopHeight-260,1))
						.Speak($msg)
					WEnd
					.Hide
					.StopAll
				Endwith
И ещё, цикл который удерживает персонажа, вызывает большую загрузку ЦП, я поставил паузу в 10 мc, и загрузки нет
-А что, при использовании Switch учитывается регистр букв? (я про StringLower).

Цитата:
Даже после Unload-а персонажа, в памяти продолжает висеть процесс AgentSvr.exe
Странно, у меня он (процесс) выгружается спустя пару секунд после Unload'а.

Цитата:
Если агент был запущен из бесконечного цикла, то, пока он не будет Unload-ен, основной цикл стоит на паузе.
Тоже заметил, поэтому я использовал AdlibEnable() до вызова функции с загрузкой персонажа.


Кстати, в системе есть более одного персонажа, благодаря этой статье, я значительно улучшил скрипт - Я написал функцию которая собирает в массив пути к этим персонажам (если они найдены) - _FiguresListToArray(), и затем на основе этих путей, методом случайного перебора (Random естественно), вызывается персонаж...

А также удалось осуществить “убийство” персонажа при любой активности пользователя (это я реализовал на основе наводок твоего примера - спасибо).


У меня такие вопросы:
1. Где можно узнать список действий определённого персонажа? (желательно средствами AutoIt'а выявить список действии для указанного персонажа).
2. Как можно, и можно ли вообще, регулировать скорость произношения речи? (или хотябы скорость печатания букв).




Вот новый скрипт - Детектер лени - Я пока не знаю какой из существующих персонажей что умеет делать, поэтому присвоил им всем одинаковые действия (ошибку вроде не выдаёт) - можно было ещё перебирать оффисные персонажи (как и в статье указанно), но я посчитал это лишнее, хватит пока и 4-ёх .

Код: Выделить весь код
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, $TimeInit=0, $SleepTime=0)
    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(100)
        DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
		If $SleepTime <> 0 And TimerDiff($TimeInit) >= $SleepTime Then ExitLoop
    Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec
    Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc

Func CharacterMsg($TextToSay, $MovexX=200, $MoveY=200, $Sleep=5000)
	If $TextToSay = "" Then $TextToSay = "Oops! there was an Error!"
	$FiguresArr = _FiguresListToArray()
	If Not IsArray($FiguresArr) Then Return SetError(1)
	$RandomFigure = Random(1, $FiguresArr[0], 1)
	$FigurePath = $FiguresArr[$RandomFigure]
	$FigureName = StringTrimRight(StringRegExpReplace($FigurePath, '^.*\\', ''), 4)
	If Not FileExists($FigurePath) Then Return SetError(2)
	$AgentControl = ObjCreate("Agent.Control.1") 
	$SinkObject = ObjEvent($AgentControl, "event_") 
	If Not Isobj($AgentControl) Then Return SetError(3)
	$AgentControl.Connected = True
	$AgentControl.Characters.Load($FigureName, $FigurePath) 
	$hCharacter = $AgentControl.Characters($FigureName)
	With $hCharacter
		.MoveTo($MovexX, $MoveY, 0)
		.Show
		.Speak($TextToSay)
		.Play("Greet") 
		.Play("RestPose")
		$SleepInit = TimerInit()
		While TimerDiff($SleepInit) < $Sleep
			If _IdleWaitCommit(0, $SleepInit, $Sleep) <> 0 Then ExitLoop
		WEnd
		.Hide
		.StopAll
	EndWith
	$AgentControl.Characters.Unload($FigureName)
EndFunc

Func _FiguresListToArray()
	$FiguresPath1 = @WindowsDir & "\MSAGENT\CHARS\"
	$FiguresPath2 = @WindowsDir & "\srchasst\chars\"
	If Not FileExists($FiguresPath1) And Not FileExists($FiguresPath2) Then Return SetError(1)
	Local $FiguresArr[1]
	;If FileExists($FiguresPath1 & "*.acs") Then
		Local $FigureFind1 = FileFindFirstFile($FiguresPath1 & "*.acs")
		If $FigureFind1 <> -1 Then
			While 1
				$CurrentFigure = FileFindNextFile($FigureFind1)
				If @error Then ExitLoop
				ReDim $FiguresArr[UBound($FiguresArr)+1]
				$FiguresArr[0] += 1
				$FiguresArr[UBound($FiguresArr)-1] = $FiguresPath1 & $CurrentFigure
			WEnd
		EndIf
		FileClose($FigureFind1)
	;EndIf
	;If FileExists($FiguresPath2 & "*.acs") Then
		Local $FigureFind2 = FileFindFirstFile($FiguresPath2 & "*.acs")
		If $FigureFind2 <> -1 Then
			While 1
				$CurrentFigure = FileFindNextFile($FigureFind2)
				If @error Then ExitLoop
				ReDim $FiguresArr[UBound($FiguresArr)+1]
				$FiguresArr[0] += 1
				$FiguresArr[UBound($FiguresArr)-1] = $FiguresPath2 & $CurrentFigure
			WEnd
		EndIf
		FileClose($FigureFind2)
	;EndIf
	Return $FiguresArr
EndFunc

Func Quit()
	Exit
EndFunc
Напомню, что в данном примере (где $MinLaziness = 10, а $MaxLaziness = 60), нужно ничего не делать как минимум от 10-ти до 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


Последний раз редактировалось Creat0R, 14-03-2007 в 18:00. Причина: Небольшая поправка в коде


Отправлено: 22:53, 12-03-2007 | #272


Аватара для Sanja Alone

Ищу Человека…


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

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


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

Цитата:
А что, при использовании Switch учитывается регистр букв?
Только что проверил - не учитывается. Можно StringLower убрать.

Цитата:
Я написал функцию которая собирает в массив пути к этим персонажам
У меня так тоже сделано, причем с учетом персонажей в директориях Офиса, но это уже явный перебор

Цитата:
Как можно, и можно ли вообще, регулировать скорость произношения речи?
Код: Выделить весь код
[HKEY_CURRENT_USER\Software\Microsoft\Speech\Voices]
;низкая
"DefaultTTSRate"=dword:FFFFFFF6
;средняя
"DefaultTTSRate"=dword:00000000
;высокая
"DefaultTTSRate"=dword:0000000a
Ну, и промежуточные значения есть, ес-но. Посмотри regshot-ом.

-------
Sanja Alone's site (ConvRegToAU3, OEsr, RSA, AutoIt скрипты)

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

Отправлено: 16:47, 14-03-2007 | #273


Новый участник


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

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


привет, в общем такая проблемка, нужно чтобы в этом скрипте перед 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

Последний раз редактировалось Sanja Alone, 15-03-2007 в 11:35. Причина: Добавление тэга code


Отправлено: 17:29, 14-03-2007 | #274


Аватара для Sanja Alone

Ищу Человека…


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

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


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

-------
Sanja Alone's site (ConvRegToAU3, OEsr, RSA, AutoIt скрипты)


Отправлено: 19:01, 14-03-2007 | #275


Аватара для Creat0R

Must AutoIt


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

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


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 естественно должен передаваться как объект загрузки персонажа.

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

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

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

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

Отправлено: 00:14, 15-03-2007 | #276


Аватара для Sanja Alone

Ищу Человека…


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

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


Creat0R
Цитата:
что это за regshot?
RegShot (редакция ParaGlider-а)

Цитата:
жалко что нельзя просто цифрами задавать
Можно. Представь себе координатную ось с 21 координатой (10 отрицательных, ноль и 10 положительных):
Код: Выделить весь код
FFFFFFF6 - минимальное значение
FFFFFFF7
...
FFFFFFFF
00000000 - 0 (начало координат)
00000001
...
00000009
0000000a - максимальное значение

-------
Sanja Alone's site (ConvRegToAU3, OEsr, RSA, AutoIt скрипты)

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

Отправлено: 11:25, 15-03-2007 | #277


Новый участник


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

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


Код: Выделить весь код
;   Автоматическое заполнение квитанции
;  ========================================

;клавиши (разрешенные клавиши: 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

Последний раз редактировалось Sanja Alone, 15-03-2007 в 23:22. Причина: Добавление тэга code


Отправлено: 14:40, 15-03-2007 | #278


Аватара для Sanja Alone

Ищу Человека…


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

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


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

-------
Sanja Alone's site (ConvRegToAU3, OEsr, RSA, AutoIt скрипты)


Отправлено: 23:15, 15-03-2007 | #279


Новый участник


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

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


Спасибо за код, но возникла следущая ошибочка

Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
Local $ret =^ERROR

Error Uknown Function name

Отправлено: 10:05, 16-03-2007 | #280



Компьютерный форум 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




 
Переход