PDA

Показать полную графическую версию : [архив - Часть 2] 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] 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Creat0R
27-09-2007, 08:36
Maza Faka,
PID я получаю по пути к запускному файлу (_PathIsProcess()), но не тут проблема, всё(?) дело в функции _SysTrayIconPids().

amel27,
может эту UDF тоже подправить и обрабатывать ВСЕ иконки как безымянные, т.е. по индексу?
Гинеально!!! Работает!!! :yahoo: :clapping:
Спасибо!!!

Maza Faka
27-09-2007, 09:33
Как правильно создавать многомерные массивы? Например функция ProcessList возвращает двумерный массив:

$list = ProcessList()
for $i = 1 to $list[0][0]
msgbox(0, $list[$i][0], $list[$i][1])
next

По аналогии пытаюсь создать свой двумерный массив, но не получается:

Global $TestArray[4][4] = [[3, "First", "Second", "Third"], [3, "John", "Steve", "Arnold"]]

For $i = 1 To $TestArray[0][0]
MsgBox(0, $TestArray[$i][0], $TestArray[$i][1])
Next

Работает только, если сделать так:

MsgBox(0, $TestArray[0][$i], $TestArray[1][$i])

Кто нибудь может разжевать :)

Maza Faka
27-09-2007, 09:59
amel27
Ты ГУРУ! :pray:
Сделал так:

#include "SysTray_UDF.au3"

$ListArray = ProcessList("LA.exe")

MsgBox(0, "Hide", "Now hide is Light Alloy icons")
For $i = 1 To $ListArray[0][0]
$index = _SysTrayIconIndex($ListArray[$i][1])
_SysTrayIconVisible(1, $index)
Next

Sleep(1000)

MsgBox(0, "Visible", "Now visible is Light Alloy icons")
For $i = 1 To $ListArray[0][0]
$index = _SysTrayIconIndex($ListArray[$i][1])
_SysTrayIconVisible(0, $index)
Next

Работает! :kruto:

P.S.
Может сообщишь автору, о том, что изменил его библиотеку и теперь её можно считать не бетой, а релизом. ;)

Angelus
27-09-2007, 10:00
А как заставить GUI интерфейс использовать рисунки которые вшиты в EXE файл???

SAOPP
27-09-2007, 10:13
Т.е. закрыть языковую панель таким способом, что я предложил не получится? :(

Creat0R
27-09-2007, 10:56
Maza Faka,
Как правильно создавать многомерные массивы?
Я если честно сам до сих пор точно понять не могу, но для себя сделал функцию (не всегда подходящюю правда), которая создаёт двумерный массив из строк по разделителю:


#include <Array.au3>

Dim $Array = _Array2DCreate("Jimmy|Mike|George", "0|1|2")

_ArrayDisplay($Array)

Func _Array2DCreate($1DStr, $2DStr, $Delim="|")
Local $2DArray[1][1], $iUbound
Local $BiggestArray = StringSplit($1DStr, $Delim)
Local $SmallestArray = StringSplit($2DStr, $Delim)

If UBound($SmallestArray) > UBound($BiggestArray) Then
Local $TempArray = $BiggestArray
$BiggestArray = $SmallestArray
$SmallestArray = $TempArray
EndIf

ReDim $SmallestArray[UBound($BiggestArray)]

For $i = 1 To UBound($BiggestArray)-1
$iUbound = UBound($2DArray)
ReDim $2DArray[$iUbound+1][2]
$2DArray[$iUbound][0] = $BiggestArray[$i]
If $SmallestArray[$i] <> "" Then $2DArray[$iUbound][1] = $SmallestArray[$i]
Next
$2DArray[0][0] = $iUbound
Return $2DArray
EndFunc


“Ведущий массив”, это самый большой найденный массив :).

Angelus, как заставить GUI интерфейс использовать рисунки которые вшиты в EXE файл???
Смотря для чего, обычно можно использовать GuiCtrlSetImage(-1, "File.exe", 0)
Где 0 это имя ресурса изображения в Exe'шнике.

SAOPP,
закрыть языковую панель таким способом, что я предложил не получится?
Ты так и не ответил на мой вопрос:
может есть уже открыто подобное окошко где то? перезапустить систему пробовал?
У меня это работает :dont-know

amel27
27-09-2007, 12:44
Maza Faka
Ты ГУРУда ну брось - скрипт содержал весь нужный код... хотя не совсем понятна мотивация автора при выборе алгоритма, может из соображений производительности? :dont-know
Может сообщишь автору, о том, что изменил его библиотеку и теперь её можно считать не бетой, а релизом.это надо просить Creat0R'а, я на офсайте редко бываю... его вопрос, ему и обосновывать перед автором :)

SAOPP
27-09-2007, 14:31
может есть уже открыто подобное окошко где то? перезапустить систему пробовал? »
Да нет, нету ничего. Ни на виртуалке ни на реальной машине ничего не происходит...

Сейчас протестировал, на виртуалке всё работает, хм странно, надеюсь это трабла этой ОС, поэтому думаю при установке на реальную машину скрипт сработает ;)

Creat0R
28-09-2007, 17:19
Многие (и наверное я сам) тут спрашивали, как копировать большой файл, и при этом получать данные прогресса...
Так вот, используя быстро набирающую популярность на оф. форуме библиотеку DllCallBack.au3 (http://www.autoitscript.com/forum/index.php?showtopic=50768&st=0), можно этого добиться очень просто!!!:


#include <DllCallBack.au3>

_FileCopyEx("C:\BigFile.avi", @ScriptDir & "\BigFile.avi")

Func _FileCopyEx($Source, $Dest)
If Not FileExists($Source) Then Return SetError(1)
ProgressOn("_FileCopyEx() Demo", "Копирование, ждите плиз...")
$pCopyProgressRoutine = _DllCallBack("_CopyProgressRoutine", "uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;ptr")
DllCall("kernel32.dll", "int", "CopyFileExA", _
"str", $Source, _
"str", $Dest, _
"ptr", $pCopyProgressRoutine, _
"ptr", 0, _
"int", 0, _
"int", 0)
_DllCallBack_Free($pCopyProgressRoutine)
Sleep(1000)
ProgressOff()
EndFunc

Func _CopyProgressRoutine($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
$Precent = $TotalBytesTransferred/$TotalFileSize*100
ProgressSet($Precent, "Проценты: " & Round($Precent, 1) & " %")
Return 0
EndFunc ;==>_CopyProgressRoutine


Вот и всё! ;)

TERMINAL
28-09-2007, 17:28
Creat0R, а как можно сделать если мне, например, нужно скопировать целую папку ( I386 c диска)и чтобы прогрес был и показывал сколько осталось минут и процентов? Можешь помочь?

Creat0R
28-09-2007, 17:36
Maza Faka,
Может сообщишь автору, о том, что изменил его библиотеку и теперь её можно считать не бетой, а релизом
А бибилиотека разве бетой считается? если ты про AutoIt3 Beta то это значит что библиотека требует (требовала) последнюю бетку самого AutoIt :)

amel27,
его вопрос, ему и обосновывать перед автором
Согласен, обосновал (http://www.autoitscript.com/forum/index.php?s=&showtopic=13704&view=findpost&p=410307) ;).

TERMINAL,
нужно скопировать целую папку ( I386 c диска)и чтобы прогрес был и показывал сколько осталось минут и процентов?
Можно с ситемным диалогом:



_FileCopy("C:\My Dir\*.*", "C:\Dest Dir")

Func _FileCopy($Source, $Dest)
If Not FileExists($Dest) Then DirCreate($Dest)
$WinShell = ObjCreate("shell.application")
$WinShell.NameSpace($Dest).CopyHere($Source)
EndFunc

Maza Faka
28-09-2007, 18:24
Creat0R
Можно с ситемным диалогом:
:kruto: Огромное спасибо за код, давно искал нечто подобное! Респект!

TERMINAL
28-09-2007, 18:29
Creat0R, Спасибо ! А можно с перезаписью файлов (чтобы по умолчанию перезаписывало)?!

Maza Faka
28-09-2007, 18:42
Creat0R
И сразу вопрос, где можно найти описание синтаксиса COM - обьектов? :)

А можно с перезаписью файлов (чтобы по умолчанию перезаписывало)? »
Так по умолчанию перезаписывает.

SAOPP
28-09-2007, 21:04
Creat0R, всё же как то скрипт странно работает, на виртуальной машине после применения скрипта, индикатор закрывается, но сразу же появляется "плавающая" языковая панель - здесь я просто бессильный, может быть скрипту дать задержку между выполнением его действий (внутри самого скрипта)?

Creat0R
29-09-2007, 03:18
TERMINAL, Maza Faka,
можно с перезаписью файлов »
Я вспомнил, есть ещё и API методы для копирования с отображением системного диалога...

Вот функции прямо из оф. форума (ссылка (http://www.autoitscript.com/forum/index.php?s=&showtopic=47158&view=findpost&p=353140) на источник) включая константы и обработчик ошибок (я лишь немного подправил функции):

#Region consts
Global Const $FOR_MOVE = 0x0001
Global Const $FOR_COPY = 0x0002
Global Const $FOR_DELETE = 0x0003
Global Const $FOR_RENAME = 0x0004

Global Const $FOF_MULTIDESTFILES = 0x0001
Global Const $FOF_CONFIRMMOUSE = 0x0002
Global Const $FOF_SILENT = 0x0004
Global Const $FOF_RENAMEONCOLLISION = 0x0008
Global Const $FOF_NOCONFIRMATION = 0x0010
Global Const $FOF_WANTMAPPINGHANDLE = 0x0020
Global Const $FOF_ALLOWUNDO = 0x0040
Global Const $FOF_FILESONLY = 0x0080
Global Const $FOF_SIMPLEPROGRESS = 0x0100
Global Const $FOF_NOCONFIRMMKDIR = 0x0200
Global Const $FOF_NOERRORUI = 0x0400
Global Const $FOF_NOCOPYSECURITYATTRIBS = 0x0800
Global Const $FOF_NORECURSION = 0x1000
Global Const $FOF_NO_CONNECTED_ELEMENTS = 0x2000
Global Const $FOF_WANTNUKEWARNING = 0x4000
Global Const $FOF_NORECURSEREPARSE = 0x8000
#Endregion consts

Func _CopyWithProgress($sFrom, $sTo, $OPERATION_MODE, $GENERAL_MODE)
; version 1 by SumTingWong on 5/26/2006
; http://www.autoitscript.com/forum/index.php?showtopic=11888
; updated by lod3n on 6/5/2007

Local $SHFILEOPSTRUCT
Local $pFrom
Local $pTo
Local $aDllRet
Local $nError = 0
Local $i

If FileExists($sTo) And StringRight($sFrom, 3) <> "*.*" And StringInStr(FileGetAttrib($sFrom), "D") Then $sFrom &= "\*.*"

$SHFILEOPSTRUCT = DllStructCreate("int;uint;ptr;ptr;uint;int;ptr;ptr")
If @error Then Return "nostruct"
; hwnd
DllStructSetData($SHFILEOPSTRUCT, 1, 0)
; wFunc
DllStructSetData($SHFILEOPSTRUCT, 2, $OPERATION_MODE)
; pFrom
$pFrom = DllStructCreate("char[" & StringLen($sFrom)+2 & "]")
; pFrom will now be null-terminated at StringLen($sFrom)+1
DllStructSetData($pFrom, 1, $sFrom)
For $i = 1 To StringLen($sFrom)+2
If DllStructGetData($pFrom, 1, $i) = 10 Then DllStructSetData($pFrom, 1, 0, $i)
Next
; We need a second null at the end
DllStructSetData($pFrom, 1, 0, StringLen($sFrom)+2)
DllStructSetData($SHFILEOPSTRUCT, 3, DllStructGetPtr($pFrom))
; pTo
$pTo = DllStructCreate("char[" & StringLen($sTo)+2 & "]")
; pTo will now be null-terminated at StringLen($sTo)+1
DllStructSetData($pTo, 1, $sTo)
; We need a second null at the end
DllStructSetData($pTo, 1, 0, StringLen($sTo)+2)
DllStructSetData($SHFILEOPSTRUCT, 4, DllStructGetPtr($pTo))
; fFlags
DllStructSetData($SHFILEOPSTRUCT, 5, $GENERAL_MODE)
; fAnyOperationsAborted
DllStructSetData($SHFILEOPSTRUCT, 6, 0)
; hNameMappings
DllStructSetData($SHFILEOPSTRUCT, 7, 0)
; lpszProgressTitle
DllStructSetData($SHFILEOPSTRUCT, 8, 0)
$aDllRet = DllCall("shell32.dll", "int", "SHFileOperation", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
$retcode = $aDllRet[0]
$pFrom = 0
$pTo = 0
$SHFILEOPSTRUCT = 0
If $retcode <> 0 Then
ConsoleWrite(hex($retcode) & ": " & SHFileOperationErrDecode($retcode) & @crlf)
SetError($nError)
Return False
EndIf
Return True
EndFunc

Func SHFileOperationErrDecode($errNum)
Switch $errNum
case 113
return "The source and destination files are the same file."
case 114
return "Multiple file paths were specified in the source buffer, but only one destination file path."
case 115
return "Rename operation was specified but the destination path is a different directory. Use the move operation instead."
case 116
return "The source is a root directory, which cannot be moved or renamed."
case 117
return "The operation was cancelled by the user, or silently cancelled if the appropriate flags were supplied to SHFileOperation."
case 118
return "The destination is a subtree of the source."
case 120
return "Security settings denied access to the source."
case 121
return "The source or destination path exceeded or would exceed MAX_PATH."
case 122
return "The operation involved multiple destination paths, which can fail in the case of a move operation."
case 124
return "The path in the source or destination or both was invalid."
case 125
return "The source and destination have the same parent folder."
case 126
return "The destination path is an existing file."
case 128
return "The destination path is an existing folder."
case 129
return "The name of the file exceeds MAX_PATH."
case 130
return "The destination is a read-only CD-ROM, possibly unformatted."
case 131
return "The destination is a read-only DVD, possibly unformatted."
case 132
return "The destination is a writable CD-ROM, possibly unformatted."
case 133
return "The file involved in the operation is too large for the destination media or file system."
case 134
return "The source is a read-only CD-ROM, possibly unformatted."
case 135
return "The source is a read-only DVD, possibly unformatted."
case 136
return "The source is a writable CD-ROM, possibly unformatted."
case 183
return "MAX_PATH was exceeded during the operation."
case 1026, 0000005
return "An unknown error occurred. This is typically due to an invalid path in the source or destination. This error does not occur on Microsoft Windows Vista and later."
case 65536
return "An unspecified error occurred on the destination."
case 65652
return "Destination is a root directory and cannot be renamed."
Case 0000002
return "Confirmation was canceled"
EndSwitch

return "SHFileOperation returned errorcode " & hex($errNum) & ", which is not recognized"
EndFunc

Вот примеры использования:


;Копирование содержимого папки с подтверждением на перезапись (подавляется диалог о создании папки - константа $FOF_NOCONFIRMMKDIR)
_CopyWithProgress("C:\Source", "C:\Dest", $FOR_COPY, $FOF_NOCONFIRMMKDIR)

;Копирование содержимого папки подавляя подтверждение на перезапись (перезапись без подтверждения)
_CopyWithProgress("C:\Source", "C:\Dest", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR, $FOF_NOCONFIRMATION))

;Копирование содержимого папки без рекурсии (файлы только в указанной папке)
_CopyWithProgress("C:\Source\*.*", "C:\Dest", $FOR_COPY, $FOF_NORECURSION)

;Копирование только файлов с возможностью отмены действии (без каталогов)
_CopyWithProgress("C:\Source", "C:\Dest", $FOR_COPY, BitOR($FOF_FILESONLY, $FOF_ALLOWUNDO))


Maza Faka, где можно найти описание синтаксиса COM - обьектов? »
Ну как, в справке вообще то :)
Если ты про мой пример конкретно, я его с оф. форума стащил, но вообще то это нужно смотреть документацию к тому или инному приложению (в этом случае к Windows ;) ).

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

Creat0R
29-09-2007, 10:24
Обновил Скрипт расскраски кода AutoIt для помещения в форумы (Au3ToPst) (http://creator-lab.ucoz.ru/load/3-1-0-18):

Список изменении:

v1.5
* Исправлена проблема при открытии программы из редактора SciTE - если в последний раз использовалась опция ручного ввода кода, то естественно содержимое скрипта не отображалось, теперь птичка "Ввести код вручную" не будет ставиться если была передана ком. строка.
* Добавленна поддержка Ctrl + A (выделяет весь код в Edit поле).
* В пункт меню редактора SciTe при интеграции теперь подключается и горячая клавиша Ctrl + K.
* Исправлена большая загрузка ЦП при длительных колдовании курсора мышки над полем ввода кода :).
* Мелкие ошибки и недочёты поправлены.

Creat0R
29-09-2007, 20:58
amel27
Если при обработке раскраски присутствуют #Region Something, то обработка не может распознать стили - их можно как то добавить?

mariolast
30-09-2007, 00:37
При установке приложени устанавливаются файлы setup.msi -> EN.msi -> VBA.msi -> FontNav.msi. То есть setup.msi отрабатывает свое и передает "эстафетную палочку" дальше. Надо чтобы скрипт отслеживал выполнение каждоготиз четырех компонентов и во время выполнения каждого из них приостанавливал выполнение скрипта.
Я думал так

WinWaitActive ( "EN" )
WinWaitClose ( "EN")
WinWaitActive ( "VBA" )
WinWaitClose ( "VBA" )
WinWaitActive ( "FontNav" )
WinWaitClose ( "FontNav" )

Но слишком быстро нав. выполняется последний компонент и скрипт не успевает что ли увидеть окно "FontNav" (компонент FontNav.msi), в результате висит вечно в паузе.

amel27
30-09-2007, 09:33
mariolast
функция WinWaitClose() обязательна?.. попробуйте без них

Creat0RЕсли при обработке раскраски присутствуют #Region Something, то обработка не может распознать стили - их можно как то добавить?переделал базовый скрипт с целью уменьшения размера выходного текста и учетом новых познаний в регулярных выражениях :) , основные изменения:
- убрал промежуточные замены на "#", теперь этот символ можно использовать в коде;
- добавил черезстрочное объединение стилей, если стиль не изменяется от строки к строке;
- убрал из стилей жирный шрифт, опять же для уменьшения количества форматных символов.

скрипт лежит там же: http://forum.oszone.net/post-511410-474.html

З.Ы. Если требуется совпадения стилей с SciTE нужно будет кое-где добавить теги [B]




© OSzone.net 2001-2012