PDA

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

amel27
06-02-2007, 11:35
DiamondПодскажите, как с помощью WinApi поменять частоту обновления экрана?; Пример использования функции
_DisplaySetRes (1024, 768, 32, 75)

; Функция изменения видеорежима (для одного монитора)
Func _DisplaySetRes ($width, $height, $depth, $freq)
Local $dev = DllStructCreate ("byte[32];int[10];byte[32];int[6]")
; Возвращаем текущее состояние устройства
Local $ret = DLLCall ('user32.dll', 'int', 'EnumDisplaySettings', _
'ptr' , 0, _
'long', 0, _
'ptr' , DllStructGetPtr ($dev) )
If @error Then Return 0
If $ret[0]=0 Then Return 0
; Правим нужные элементы структуры
DllStructSetData ($dev, 4, $depth, 1)
DllStructSetData ($dev, 4, $width, 2)
DllStructSetData ($dev, 4, $height, 3)
DllStructSetData ($dev, 4, $freq, 5)
; Проверяем корректность параметров
$ret = DllCall ('user32.dll', 'int', 'ChangeDisplaySettings', _
'ptr', DllStructGetPtr ($dev), _
'int', 2 )
If @error Then Return 0
; Если все ОК - применяем новые параметры
If $ret[0] =0 Then
$ret = DllCall ('user32.dll', 'int', 'ChangeDisplaySettings', _
'ptr', DllStructGetPtr ($dev), _
'int', 1 )
If @error Then Return 0
Return 1
Else
Return -1
EndIf
EndFunc

amel27
06-02-2007, 12:13
Creat0RА также способ подсчёта количества символов в файлеАльтернативный вариант. Правда пришлось сдвинуть значения флагов, чтобы одному биту соответствовал один пропускаемый символ: @CR - Bit 1 ; @LF - Bit 2.Func _FileCharCount ($file, $flag=1)
Local $str = FileRead ($file)
If BitAND ($flag, 1) Then $str = StringStripCR ($str)
If BitAND ($flag, 2) Then $str = StringReplace ($str, @LF, '')
Return StringLen ($str)
EndFunc

Diamond
06-02-2007, 18:29
amel27
По поводу частоты обновления
Отлично! Всё работает! :UP: Если честно, я и не надеялся что вообще кто нибудь ответит, иначе задал бы этот вопрос ещё месяц назад. Большое спасибо!
P.S.
Была проблема с видеокартой, в некоторых играх частота сбрасывалась с 85 Гц. на 60 Гц. Перепробовал уже (наверное) все известные утилиты и ни одна из них не помогла. Теперь проблема решилась. :victory: Ещё раз спасибо!

i_mihal
12-02-2007, 01:19
Есть фирменная YAMAHA'овская программа для конвертирования звуковых WAV-файлов
в формат MMF (используется в сотовых телефонах Samsung, LG, Pantech, etc...)
Называется WSC-MA2, сайт http://smaf-yamaha.com/

Это, похоже, единственая программа, которая может конвертировать WAV->MMF.
Но она не работает из командной строки, у нее нет меню, она не работат в пакетном режиме.
Для того чтоб сконвертировать WAV в MMF надо схватить WAV-файл мышкой,
перетащить и бросить его на маленькое, красивенькое окошко этой программы.

Можно ли с помощью AutoIt проделать такую операцию?
То есть "взять некий WAV-файл мышкой" и "кинуть его на окошко этой проги"
(в перспективе взять по-очереди в цикле все файлы с расширением WAV
и покидать их на окошко программы)

Реализуемо ли это в рамках Auto-It?
или вообще как-нибудь, кроме как вручную.

спасибо.

amel27
12-02-2007, 06:36
i_mihal
обычно перетаскивание можно заменить на копировать/вставить через буфер обмена...

amel27
12-02-2007, 07:05
Чтение параметров локализации средствами API:$sys = DllCall ("kernel32.dll", "int", "GetSystemDefaultLCID")
$usr = DllCall ("kernel32.dll", "int", "GetUserDefaultLCID")
MsgBox (0,'Default locale ID','Пользователи: ' & @TAB & @TAB & $usr[0] & @CRLF & _
'Системные службы: ' & @TAB & $sys[0])

Creat0R
12-02-2007, 10:59
Написал давно желанную функцию, но она работает как бы наполовину - она должна заменять стандартную функцию FileSelectFolder, но проблема в том, что у меня не получается - А) либо создать все вкладки (в TreeView) для всех существующих папок (это также займёт кучу времени на их генерацию), Б) либо создавать их “находу” (т.е в момент вызова/раскрытия той или иной вкладки) - в принципе, проблема со вторым вариантом такая - нужно узнать как очистить одну выделенную вкладку от её подвкладок (не удаляя её саму).
Для чего нужна такая функция? во-первых для того чтобы можно было прикреплять это окно к другому приложению (или к родительскому гуи) - эта одна из основных причин (даже самая) - далее можно также используя подобную функцию, просто создавать это окно с разными размерами, с разными кнопками и возвращаемой информацией, также будет возможность задать этому окну атрибут “поверх всех окон” и т.д и т.п...

Вот в принципе сам скрипт с примером:


#include <GUIConstants.au3>
#include <GUITreeView.au3>
#include <File.au3>

$Parent = GUICreate("test", 200, 200)
$Select = GUICtrlCreateButton("Select", 50, 50)

GUISetState()

While 1
$Msg = GUIGetMsg()
If $Msg = -3 Then ExitLoop
If $Msg = $Select Then
GUISetState(@SW_DISABLE)
$Path = _FileSelectFolder("Select Folder", "Choose needed Path:", 300, 300, 1, $Parent)
If Not @error Then MsgBox(64, "Path", "The selected path is: <" & $Path & ">")
GUISetState(@SW_RESTORE)
GUISetState(@SW_ENABLE)
EndIf
WEnd

GUIDelete()

Func _FileSelectFolder($Title, $Dialog_Text, $Width=300, $Heght=300, $OnTop=0, $Hwnd="")
Opt("GuiOnEventMode", 1)
Global $IsExit = 0, $IsCancel = 0, $PathInput, $MainTreeViewID, $TOPMOST
If $OnTop = 1 Then $OnTop = 8
GUICreate($Title, $Width, $Heght, -1, -1, $WS_SYSMENU+$WS_CAPTION+$WS_SIZEBOX, $WS_EX_CONTEXTHELP+$OnTop, $Hwnd)
GUISetOnEvent(-3, "Cancel")

GUICtrlCreateLabel($Dialog_Text, 10, 5)

$ButtonOK = GUICtrlCreateButton("OK", $Width-180, $Heght-25, 70, 20)
GUICtrlSetOnEvent(-1, "OK")

$ButtonCancel = GUICtrlCreateButton("Cancel", $Width-80, $Heght-25, 70, 20)
GUICtrlSetOnEvent(-1, "Cancel")

$PathInput = GUICtrlCreateInput("", 10, $Heght-50, $Width-20)

$MainTreeViewID = GUICtrlCreateTreeView(10, 30, $Width-20, $Heght-90, BitOr($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)

GUISetState()

$DrivesArr = _DrivesListToArray("all")
If IsArray($DrivesArr) Then
Dim $MainDriveID[$DrivesArr[0]+1], $CurrentIcon, $CurrentIcID
For $i = 1 To $DrivesArr[0]
$CurrentDrive = $DrivesArr[$i]
If $CurrentDrive <> "a:" And $CurrentDrive <> "b:" Then
$CurrentIcon = $CurrentDrive & "\" & IniRead($CurrentDrive & "\Autorun.inf", "Autorun", "Icon", "")
$CurrentIcID = 0
EndIf
If Not FileExists($CurrentIcon) Then
$CurrentIcon = "shell32.dll"
$CurrentIcID = 8
EndIf
$MainDriveID[$i] = GUICtrlCreateTreeViewItem(StringUpper($CurrentDrive) & "\", $MainTreeViewID)
GUICtrlSetOnEvent(-1, "GetText")

If $CurrentDrive = "a:" Or $CurrentDrive = "b:" Then
GUICtrlSetImage(-1, "shell32.dll", 6, 0)
ElseIf DriveGetType($CurrentDrive) = "CDROM" Then
GUICtrlSetImage(-1, "shell32.dll", 11, -1)
Else
GUICtrlSetImage(-1, StringStripWS($CurrentIcon, 3), $CurrentIcID, -1)
EndIf

If $CurrentDrive <> "a:" And $CurrentDrive <> "b:" Then
$DirsArr = _FileListToArray($CurrentDrive, "*", 2)
If IsArray($DirsArr) Then
For $j = 1 To $DirsArr[0]
$CurrentDir = $DirsArr[$j]
GUICtrlCreateTreeViewItem($CurrentDir, $MainDriveID[$i])
GUICtrlSetOnEvent(-1, "GetText")
_GUICtrlTreeViewSetIcon($MainTreeViewID, -1, "shell32.dll", 4)
Next
EndIf
EndIf
Next
EndIf

While $IsExit = 0
Sleep(10)
WEnd
$Path = StringReplace(_GUICtrlTreeViewGetTree($MainTreeViewID, "\"), "\\", "\")
GUIDelete()
Opt("GuiOnEventMode", 0)
If $IsCancel = 1 Then
SetError(1)
Return ""
Else
Return $Path
EndIf
EndFunc

Func GetText()
GUICtrlSetData($PathInput, GUICtrlRead(@GUI_CtrlId, 1))
EndFunc

Func OK()
Global $IsExit = 1
EndFunc

Func Cancel()
Global $IsExit = 1, $IsCancel = 1
EndFunc

Func Quit()
Exit
EndFunc

Func _DrivesListToArray($Type)
$DrivesArr = DriveGetDrive($Type)
If IsArray($DrivesArr) Then
Dim $DrivesListArr[$DrivesArr[0]+1]
$DrivesListArr[0] = $DrivesArr[0]
For $iDrive = 1 To $DrivesArr[0]
$CurrentDrive = $DrivesArr[$iDrive]
$DrivesListArr[$iDrive] = $CurrentDrive
Next
EndIf
Return $DrivesListArr
EndFunc


И ещё хотелось бы сделать чтобы можно было задать при вызове функции исходную папку (Init Dir) - но увы я только сегодня начал разбирать основы TreeView, и поэтому не знаю как заставить раскрыться вкладкам на том месте где находится указанное имя (т.е имя вкладки).

biggreeder
12-02-2007, 21:42
Вопрос знатокам.
А можно ли как-нибудь "раскомпилировать" .exe файл обратно в .au3?

Creat0R
12-02-2007, 22:39
biggreeder
можно ли как-нибудь "раскомпилировать" .exe файл обратно в .au3?

Посмотри в папке с установленным AutoIt'ом - C:\Program Files\AutoIt3\Extras\Exe2Aut - но этолько если в момент компилляции опция позволяющая декомпилировать была утановлена, а также если был задан пароль, то без него никак не декомпилировать.

biggreeder
12-02-2007, 23:52
Creat0R
Спасибо, дружище. Выручил. Винт накрылся. Думал пропали все мои скрипты (на диск записывал только exe-файлы)

Dicken
13-02-2007, 07:07
День добрый,
интересует следующий вопрос:
Можно ли запускать IT скрипт с какимилибо параметрами, например мне нужен скрипт который бы выводи мне 2 значения из командной строки
т.е. скрипт я запускаю RUN.exe параметр1 параметр2 и в результате скрипт выдал мне мессаге в котором мне былибы выданы 1 и 2 параметры
заранее спасибо

Positiv
13-02-2007, 08:13
Вообщем такой трабл, при установке Agnitum Outpost Firewall выдает 2 окна с ошибками Microsoft Visual C++ Runtime Library. Я написал в скрипте функцию отлова этих окон с ошибками, но когда закрывается первое окно с ошибкой установка стопорится на Мастере Настройки, т.е дальше только вручную нажимать кнопки приходится. Посмотрите скрипт, мож че подскажите, или из-за чего такие ошибки вылетают, вроде библиотеки Си стоят.
СИНИМ выделено то, что добавил я, все остальное исходный скрипт от Sanja Alone
#cs
----------------------
Приложение: Agnitum Outpost
На какой(их) версии(ях) тестировалось: 3.5 (ru); 3.51 (ru)

Автор скрипта: Sanja Alone (http://forum.oszone.net/member.php?userid=28800)
----------------------
#ce
;предотвращение возможности множественного запуска скрипта
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)
;блокируем мышь и клаву
;AutoItSetOption("TrayIconHide", 1)
;Отображать текущую строку сценария с помощью индикатора системной панели в режиме отладки.
AutoItSetOption("TrayIconDebug", 1)
AutoItSetOption("SendKeyDelay", 15)
If ProcessExists ( "ps.exe" )<>0 Then
ProcessClose ( "ps.exe" )
ProcessWaitClose ( "ps.exe" )
EndIf
;нельзя блокировать при находящемся в памяти Punto Switcher-е - не будет работать установка
;блокируем мышь и клаву
;If @OSType="WIN32_NT" Then BlockInput ( 1 )
#cs
----------------------
объявление переменных
----------------------
$file - установочный файл
$serial - если имеете рабочий ключ, то введите его сюда
$programgroup - в какую программную группу положить ярлыки программы
$delfromautorun - удалить Outpost из автозапуска (1 - удалить (по ум.), любое другое значение - не удалять)

----------------------
#ce
Global $file='OutpostProInstall.exe', $serial='XXXXX', $programgroup='Agnitum Outpost Firewall', $delfromautorun=1
AdlibEnable("wfp",1000)
If FileExists ( @ProgramFilesDir & '\Agnitum\Outpost Firewall\outpost.exe' ) Then
MsgBox (64, 'Сообщение', 'Agnitum Outpost Firewall уже установлен', 5)
Exit
Else
Run ( @ScriptDir & '\' & $file & ' /LANG="ru" /NOAUTOUPDATE /NORESTART /VERYSILENT' )
EndIf
WinWait ( 'Мастер настройки' )
WinActivate ( 'Мастер настройки' )
WinWaitActive ( 'Мастер настройки' )
Send ( '{ENTER}' )
While ControlCommand ( 'Мастер настройки', '', '< &Назад', 'IsEnabled', '')=0
WEnd
WinActivate ( 'Мастер настройки' )
WinWaitActive ( 'Мастер настройки' )
;Далее
Send ( '{ENTER}' )
WinWait ( 'Ручная настройка' )
WinActivate ( 'Ручная настройка' )
WinWaitActive ( 'Ручная настройка' )
;Готово
Send ( '{ENTER}' )
#cs
----------------------
Крякнутые dll-ки и настройки программы поместите в самораспаковывающиеся архивы
settings.exe - настройки
opst_ui.exe - крякнутые dll-ки (если нет рабочего серийника)

команды SFX-сценария (для обоих архивов, winrar):

Path=Agnitum\Outpost Firewall
SavePath
Silent=1
Overwrite=1

----------------------
#ce

If WinWait("Microsoft Visual C++ Runtime Library") Then
WinActivate("Microsoft Visual C++ Runtime Library")
WinWaitActive("Microsoft Visual C++ Runtime Library")
Send("{ENTER}")
EndIf

If FileExists ( @ScriptDir & '\settings.exe' ) Then RunWait ( @ScriptDir & '\settings.exe' )
;регистрация
If $serial<>'' Then
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Agnitum\Outpost Firewall","Key","REG_SZ",$serial)
ElseIf FileExists ( @ScriptDir & '\opst_ui.exe' ) Then
RunWait ( @ScriptDir & '\opst_ui.exe' )
EndIf


;перенос ярлыков
DirCopy ( @ProgramsCommonDir & '\Agnitum\Outpost Firewall', @ProgramsCommonDir & '\' & $programgroup, 1 )
DirRemove ( @ProgramsCommonDir & '\Agnitum', 1 )

;отключить Автообновление
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Agnitum\Outpost Firewall\General","AutoUpdate","REG_DWORD",0x00000000)

;убрать Аутпост из автозапуска (если это было задано выше)
If $delfromautorun=1 Then
RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Outpost Firewall")
RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "OutpostFeedBack")
EndIf

AdlibDisable()

;BlockInput ( 0 )

Exit

Func wfp()
If WinWait("Microsoft Visual C++ Runtime Library","") Then
WinActivate("Microsoft Visual C++ Runtime Library")
WinWaitActive("Microsoft Visual C++ Runtime Library")
Send("{ENTER}")
EndIf
EndFunc

amel27
13-02-2007, 09:27
DickenМожно ли запускать IT скрипт с какимилибо параметрамипосмотри тут: http://forum.oszone.net/post-461784-212.html
... а также поищи в справке по ключу $CmdLine.

Positiv
14-02-2007, 17:37
В стандартных примерах нашёл скрипт sysinfo. Так вот, можно ли сделать, чтобы этот скрипт вместо временной папки или папки Windows(допустим) выводил пароль и имя для каждого пользователя?
Кстати, у кого-нибудь есль стандартные модули с русскими комментариями?

Diamond
14-02-2007, 18:01
Нашёл недостаток в InputBox(), проверка на IsNumber() всегда возвращает строчную переменную, даже если вводимые данные были представлены в цифре.
Предлагаю два варианта решения:
;~ Эта функция работает только с обычными целыми числами
;~ числа типа: 0x5, 4.03 или 00001 не подойдут

Проверка переменной на пренадлежность к числам:
Func _IsNumber($var)
$check=Number($var)
If String($check)=String($var) Then
Return 1
Else
Return 0
EndIf
EndFunc
;-------------------------------------
;~ А это первое что мне пришло в голову (банальный перебор)

Проверка переменной на принадлежность к целым числам:
Func _IsInt($var)
If $var= "" Then
Return -1
EndIf
$len=StringLen($var)
$check=0
For $j=48 To 57
For $i=1 To $len
If StringMid($var,$i,1)=Chr($j) Then
$check=$check+1
EndIf
Next
Next
If $check=$len Then
Return 1
Else
Return 0
EndIf
EndFunc

amel27
15-02-2007, 04:32
Diamond
Это не недостаток, а издержки типа данных Variant - кстати, аналогично и в Visual Basic... Преобразование типа происходит непосредственно перед выполнением операций с данными - например, при попытке провести арифметические операции со строковой переменной... поэтому иногда вместо преобразования проще прибавить к переменной "0". То, что InputBox() возвращает текстовую строку вполне логично. ИМХО текстовый ввод проще контролировать регулярными выражениями, тем более что этот способ универсален и подходит для любых входных данных:Func _IsStringNumber ($sVar)
Return StringRegExp ($sVar, '^ *([0-9]+\.{0,1}[0-9]*|0x[0-9]+) *$')
EndFunc

Creat0R
15-02-2007, 08:54
amel27
текстовый ввод проще контролировать регулярными выражениями
Гинеально! блин, как научиться понимать столь сложные RegExp'ресовые выражения? :biggrin: - я немало часов потратил прочитывая справку на эту тему, но так ничего и не дошло :( ....

[hr]

Немного в другую сторону...


У меня есть пару вопросов касающихся сети:

1) Функция InetGet при закачке файлов, обходит прокси? или таже UDF-функция для _InetGetSource тоже не работает с прокси?
Мне нужно каким то образом, получать данные с сети (будь то закачка файла или получение исходного кода страницы), вне зависимости от того, подключён ли компьютер к сети через прокси или напрямую. Но желательно каким то хитрым образом обходить прокси, не выключая его (т.е не заметно для юзера) - это вообще возможно?

2) В сети у меня лежит файл с расширением *.js (хотя не очень важно расширение), какое самое быстрое средство для получения с него данных (для его чтения)? неужели _InetGetSource() это самое быстрое(?) средство?

amel27
15-02-2007, 12:13
Creat0Rжелательно каким то хитрым образом обходить прокси, не выключая его если откроешь исходник _InetGetSource(), то увидишь вызов функции API-функции InternetOpen (http://msdn2.microsoft.com/en-gb/library/aa385096.aspx) из библиотеки wininet.dll, так вот второй параметр (после имени инициатора) отвечает за тип подключения (в функции жестко пробит 0), возможные параметры:0 - INTERNET_OPEN_TYPE_PRECONFIG - Запрашивает прокси или прямую конфигурацию из реестра.
1 - INTERNET_OPEN_TYPE_DIRECT - Разрешает имена всех хостов локально.
3 - INTERNET_OPEN_TYPE_PROXY - Направляет запрос прокси-серверу, в случае если не предоставлен лист обходов прокси-серверов и имени прокси-сервера нет списке прокси-серверов, которые можно обойти. В этом случае функция использует INTERNET_OPEN_TYPE_DIRECT.
4 - INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY - Запрашивает проки или прямую конфигурацию из реестра и предотвращает использование стартовых Microsoft JScript или Internet Setup (INS) файлов.

Diamond
15-02-2007, 16:05
amel27
текстовый ввод проще контролировать регулярными выражениямиИли функция не работает только у меня, или я неправильно понял её предназначение. При любом раскладе возвращает 0. Почему так?

amel27
16-02-2007, 01:53
Diamond
Обнови версию AutoIT - это новая фича, еще не устаканилась... :)




© OSzone.net 2001-2012