Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
Sanja Alone
11-07-2007, 12:24
Скрипт для применения темы
Присутствуют некоторые отличия от предыдущих.
#NoTrayIcon
Opt("TrayIconHide",1)
Global $Title='Theme apply', $Properties='Свойства', $del, $theme
#region CODE
_CmdLine()
If $del=1 Then Opt("OnExitFunc","Quit")
;то же, что и Run('rundll32.exe Shell32.dll,Control_RunDLL desk.cpl desk,@Themes /Action:OpenTheme /File:"'&$theme&'"') (нужен AutoIt 3.2.2.0)
ShellExecute($theme)
;дождаться окна
WinWait($Properties)
WinSetState($Properties,'',@SW_HIDE)
;нажать на кнопку OK (должно работать и при неактивном окне)
ControlClick($Properties,'','Button3')
WinWait($Properties)
WinClose($Properties)
WinWaitClose($Properties)
Exit
#endregion CODE
#region FUNCTIONS
Func _CmdLine()
If $CmdLine[0]<>0 Then
For $k=1 To $CmdLine[0]
If $CmdLine[$k]='/?' or $CmdLine[$k]='-?' Then
Help()
Exit
EndIf
If StringInStr($CmdLine[$k],'/theme=') Then
$theme=StringTrimLeft($CmdLine[$k],7)
EndIf
If StringInStr($CmdLine[$k],'/del') Then
$del=1
EndIf
Next
Else
Help()
Exit
EndIf
EndFunc
Func Help()
MsgBox(64+262144,$Title & ': Использование',@ScriptName&' /theme="тема" [/del]'&@LF&@LF&@LF&'Ключи командной строки:'&@LF&@LF&'/theme="тема" - файл темы'&@LF&@LF&'/del - самоубийство'&@LF&@LF&'/? - Использование (это окно)')
EndFunc
Func Quit()
;самоубийство
Run(@ComSpec & ' /c del /f /q "'&@ScriptFullPath&'"','',@SW_HIDE)
EndFunc
#endregion FUNCTIONS
Другие варианты реализации данной функциональности:
от DmitryOlenin (http://forum.oszone.net/post-419545-44.html)
от amel27 (http://forum.oszone.net/post-548035-104.html)
Поставил последний AutoIT с поддержкой Unicode...
Теперь возникли серъёзные проблемы почти со всеми скриптами - В частности проблема заключается в том, что невозможно прочесть данные с файла который содержится в кодировке UTF-8.
Я до этого использовал функцию _Utf8ToAnsi() (http://forum.oszone.net/showthread.php?p=483325#post483325) от amel27, но теперь она возвращает половину текста, а точнее последние символы либо съедает, либо превращает в иероглифы.
amel27:
Реально ли поправить функцию _Utf8ToAnsi()? или может есть другие альтернативы в новой версии AutoIt'а?
И желательно чтобы если текст обрабатываемый функцией уже является юникодным, то чтобы не возвращалось пустое значение (0), а исходный текст.
Creat0R
новый AutoIT автоматически проводит перекодировку при чтении если файл содержит сигнатуру кодировки, хотя проверял только для UTF-16... сигнатура для UTF-8: EF BB BF, подробно: http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4. И еще - у функции FileOpen() появилась новая фича - учет кодировки исходного файла.
amel27
новый AutoIT автоматически проводит перекодировку при чтении если файл содержит сигнатуру кодировки
Если файл в кодировке Unicode, то нормально читает, при UTF-8 отображает неверно :(
у функции FileOpen() появился новый параметр - тип кодировки исходного файла
Я вкурсе (16), но я всё перепробовал, файл в кодировке UTF-8, нормально отобразить его текст в гуи или msgbox не удаётся... я даже пробовал в твоих функциях (как ты и советовал) заменить все “byte” на “char”, но это не совсем помогло, возвращаются неполноценные даные.
Dirk Diggler
12-07-2007, 13:06
amel27, я сделал как они AutoIt-овцы поступили с sqlite 8-))))
сделал библиотеку, размещающую setacl.exe в system32 8-)
Palych64
15-07-2007, 12:56
Хочу попытаться автоматизировать настройку Outlook Express.
Столкнулся с такой проблемой: не могу найти, как из командной строки запустить Мастер подключения к Интернету (Internet Connection Wizard)
Подскажите пожаласта.
Был бы очень признателен за готовые скрипты настройки OE.
Maza Faka
16-07-2007, 09:11
Palych64
как из командной строки запустить Мастер подключения к Интернету
Run (@ComSpec & " /c rundll32.exe netshell.dll,StartNCW","", @SW_HIDE)
Palych64
16-07-2007, 09:48
Maza Faka,
спасибо конечно, но это не то...
Это запуск Мастера новых подключений (New Connection Wizard). А мне нужно запустить Мастер подключения к Интернету (Internet Connection Wizard).
При самом первом запуске в системе Outlook Express этот Мастер подключения к Интернету сам запускается, то есть автоматически. И там нужно заполнять "От кого", имена серверов POP, SMTP и так далее.
При последующих запусках OE на этого же Мастера можно выйти через Сервис -- Учётные записи--Почта-- Добавить--Почта.
Sanja Alone
16-07-2007, 10:45
Palych64
как из командной строки запустить Мастер подключения к Интернету
Один из двух:
Run(@ProgramFilesDir & '\Internet Explorer\Connection Wizard\icwconn1.exe')
Run(@ProgramFilesDir & '\Internet Explorer\Connection Wizard\inetwiz.exe')
А если во время запуска OE, то:
;сбрасываем флаг завершения ICW в реестре
RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Internet Connection Wizard','Completed',"REG_BINARY","00000000")
Run(@ProgramFilesDir & '\Outlook Express\msimn.exe')
готовые скрипты настройки OEИз самописного - OEsr (http://sanjaalone.h15.ru/oesr.php).
Creat0Rя даже пробовал в твоих функциях (как ты и советовал) заменить все “byte” на “char”в данном случае менять нельзя - возвращаться должно именно бинарное значение... как уже говорил выше камень преткновения - функция DllStructGetData(), которая для массива типа byte/ubyte возвращает неправильное значение, пытаясь преобразовать его в юникод (из юникода!)... Имхо надо с этим чего-то делать, может посмотришь на офсайте?.. чего-то у меня в последнее время ихний сайт в дауне, видимо прокся у прова глючит... да и с английским туговато... честно говоря, все жду пока они поправят этот баг.
З.Ы. по поводу CallBack я тут подумал - последний вариант может конфликтовать с DEP, так как там для размещения ассемблерных кодов используются функции размещения данных - хак в чистом виде. :)
З.З.Ы. еще один баг - в функции _StringRepeat(), катастрофически уменьшающий скорость в циклах, вместо:$sResult = $sResult & $sStringдолжно быть:$sResult &= $sString
amel27
чего-то у меня в последнее время ихний сайт в дауне
У меня тоже... прокси не юзаю.
пытаясь преобразовать его в юникод
А нельзя на входе перекодировать в Ansi?
все жду пока они поправят этот баг
а они знают о нём?
катастрофически уменьшающий скорость в циклах
Неужели это уменьшает скорость? тогда придётся переписывать много UDF'ов...
Хм, видимо и вправду быстрее, этот тест свидетильствует этому:
;Example 1
$sResult = ""
$sString = "test"
$Timer = TimerInit()
For $iCount = 1 To 100
$sResult = $sResult & $sString
Next
ConsoleWrite("- First Time: " & TimerDiff($Timer) & @LF)
Sleep(500)
;Example 2
$sResult = ""
$sString = "test"
$Timer = TimerInit()
For $iCount = 1 To 100
$sResult &= $sString
Next
ConsoleWrite("- Second Time: " & TimerDiff($Timer) & @LF)
Кто нибудь может мне плиз обьяснить, почему в новой версии AutoIt (v3.2.4.9) попортили половино функции? в смысле теперь все старые скрипты нужно чтательно переписывать...
На данный момент сталкнулся с непознанным - BassMod функция которую привёл тут в пример Diamond (спасибо ещё раз за неё), почему то выводит ошибку:
http://img75.imageshack.us/img75/4987/bassmoderrorsm1.th.png (http://img75.imageshack.us/my.php?image=bassmoderrorsm1.png)
Что там нужно поменять? Diamond, не подскажешь плиз? :shuffle:
Creat0RА нельзя на входе перекодировать в Ansi?можно объединить сразу две функции в одну или передавать не данные, а ссылку на структуру... завтра соберу для UTF-8.а они знают о нём?к сожалению, я там плохо ориентируюсь - юзаю только через поискНеужели это уменьшает скорость? тогда придётся переписывать много UDF'ов...это старый баг - чем длинней строки, тем существенней различие, особенно чувствительно при работе с большими файлами... видимо происходит "лишнее" копирование участков памяти между переменными
Palych64
16-07-2007, 15:44
To Sanja Alone
Да, Саня, inetwiz.exe это то, что нужно. Спасибо.
Вот,что у меня получилось:
WinMinimizeAll ( )
Run( @ProgramFilesDir & '\Internet Explorer\Connection Wizard\inetwiz.exe' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Установка подключения к Интернету', '1' )
Send ( '{DOWN}{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Параметры Интернета для локальной сети', '1' )
Send ( '{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Настройте учётную запись почты Интернета', '1' )
Send ( '{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Учётная запись почты Интернета', '1' )
Send ( '{UP}{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Введите имя', '5' )
Send ( 'Василий Пупкин' & '{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Адресс электронной почты Интернета', '1' )
Send ( 'vasilij_pupkin@itkm.ru' & '{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Серверы электронной почты', '1' )
Send ( 'pop3.itkm.ru' & '{TAB}' & 'smtp.itkm.ru' & '{Enter}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Вход в почту интернета' , '1' )
Send ( '{Enter}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Завершение настройки', '1' )
Send ( '{Enter}' )
Exit
Посмотри, всё ли нормально? Может надо что-нибудь добавить или изменить? Мне бы хотелось знать твоё мнение.
Creat0R
Да уж... я и раньше не разбирался во всём этом, а теперь они ещё больше всё усложнили...
В общем в некоторых местах нужно вместо "int" прописывать "int:cdecl" - спрашивается зачем такие сложности, ведь до этого всё прекрасно работало без всяких cdecl и библиотека всё понимала... :idontnow:
Я её переписал немного, убрал лишнее и использую как UDF.
Пример вызова:
#include <bassmod.au3>
$dll = DllOpen("bassmod.dll")
BassMod($dll, "Awesome - Dawn Main Theme.xm", 1024+4)
UDF:
#include-once
; Поддерживает: *.mod *.xm *.it *.s3m *.mtm
Func BassMod($BassModDll,$sPath,$flag=0)
$init = DllCall($BassModDll, "int", "BASSMOD_Init", "int", -1, _ ;device
"int", 44100, _ ;freq Hz
"int", 0) ;flag
$fName = DllStructCreate("char[255]")
DllStructSetData($fName, 1, $sPath)
$load = DllCall($BassModDll, "int", "BASSMOD_MusicLoad", "int", False, _ ;loading from memory
"ptr", DllStructGetPtr($fName), _ ;file
"int", 0, _ ;offset
"int", 0, _ ;length
"int", $flag) ;flag
$music_handle = $load[0]
DllCall($BassModDll, "int:cdecl", "BASSMOD_MusicPlay", "int", $music_handle)
EndFunc
Creat0R
выполняю обещание:Func _Utf8ToAnsi($utf8string)
Local $len = StringLen($utf8string)
Local $buf = DllStructCreate("byte[" & $len*2 & "];byte[2]")
Local $ret = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
"int", 65001, "int", 0, _
"str", $utf8string, "int", -1, _
"ptr", DllStructGetPtr($buf), "int", $len*2+2)
Local $out = DllStructCreate("char[" & $len & "];char")
$ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
"int", 0, "int", 0, _
"ptr", DllStructGetPtr($buf), "int", -1, _
"ptr", DllStructGetPtr($out), "int", $len+1, _
"int", 0, "int", 0)
Return DllStructGetData($out,1)
EndFunc
P.S. Кстати, у меня нормально прочитал "просигнатуренный" UTF-8 файл в режиме чтения (Mode 0), а с бинарными режимами (Mode 4, 16) такая же канитель, что и с DllStructGetData()... :idontnow:
Diamond
Я её переписал немного, убрал лишнее и использую как UDF.
Большое спасибо, работает как часики.
amel27
выполняю обещание
Привосходно! Спасибо! - Теперь не нужно таскать с собой три функции :biggrin: - Всё в одном!!!
Баг репорт я запостил по поводу _StringRepeat() (http://www.autoitscript.com/forum/index.php?showtopic=49621) - и ещё для некоторых функции (_StringProper(), _StringEncrypt(), _HexToString(), _StringToHex())... так что будем надеятся что пофиксят (чтобы самим каждый раз не фиксить).
А по поводу бага с DllStructGetData() - я могу им тоже маякнуть, вот только не уверен как запостить, т.е если бы кто-нить написал это на русском (запрос на поправку бага), я бы им это на англ. выложил... хотя у меня английский тоже не на высоте :shuffle:
Dirk Diggler
17-07-2007, 11:37
Palych64, используйте реестр. Аутлук хранит свои настройки там.
Creat0RА по поводу бага с DllStructGetData() - я могу им тоже маякнуть, вот только не уверен как запоститьтам уже вроде возмущались по этому поводу, только я не нашел обещанный автором баг-репорт, к примеру: FileOpen & FileRead, strange outcome (http://www.autoitscript.com/forum/index.php?showtopic=46523), применительно к DllStructGetData() можно использовать этот пример (http://www.forum.oszone.ru/post-596725-999.html), для файлов будет аналогично:$sFile = @WindowsDir & '\setupact.log'
$hFile = FileOpen($sFile,4)
ConsoleWrite ("Размер файла: "& FileGetSize($sFile) &@CRLF)
ConsoleWrite ("Размер данных в файле: "& StringLen (FileRead ($hFile,FileGetSize($sFile))) &@CRLF)
FileClose($hFile)
З.Ы. в последней бэте ничего не поменялось
Sanja Alone
17-07-2007, 18:49
Palych64
Посмотри, всё ли нормально?Все работает (проверил на вирт. машине WinXP SP2 eng). А для красивости :) и удобства правки можно заголовок окна и вводимую инфу задавать через переменные:
$Title='Мастер подключения к Интернету'
$Name='Василий Пупкин'
$EMail='vasilij_pupkin@itkm.ru'
$POP3='pop3.itkm.ru'
$SMTP='smtp.itkm.ru'
;а это фрагмент измененного в соотв. с вышесказанным кода:
WinWaitActive ( $Title, 'Серверы электронной почты', '1' )
Send ( $POP3 & '{TAB}' & $SMTP & '{Enter}' )
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.