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

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

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

Сообщение Creat0R »

ChVL


Цитата:



AutoIt принципиально не переваривает кириллицу в директории



Ну почему, в случае с FileInstall очень даже переваривает, возможно неверно указаны параметры функции? первый параметр не должен содержать переменных и/или макросов, только чистый текст.




Цитата:



Функция WinSetState оказалась несовместимой с WinWaitActive



Если нам нужно скрыть окна, то WinWaitActive ни к чему, окно никогда не будет активным Изображение - но вот WinWait может помочь, оно позволит ожидать окно, т.е ожидать его появление, а не активность...





Код:

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

WinWait("Title", "", 5)
WinSetState("Title", "", @SW_HIDE)
Аватара пользователя
Creat0R

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

Сообщение Creat0R »

Функции (и пример использования) для отображения стильного диалога “О Программе”





Код:

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

#include 
$Title = "About Info"
$MainLabel = "My program Name"
$CopyRLabel = "Copyright © " & @YEAR & " Company/Author. All rights reserved."
$NameURL1 = "App Web Page"
$URL1 = "http://www.autoitscript.com"
$NameURL2 = "Email"
$URL2 = "mailto:my_email@mail.com"
$NameURL3 = "Some additional link"
$URL3 = "http://personalwebpafe.com"
$LinkColor = 0x0000FF
$BkColor = 0xFFFFFF
$ParentGui = GUICreate('Parent For "About Program" Demo')
$Menu = GUICtrlCreateMenu("Help")
$AboutItem = GUICtrlCreateMenuitem("About...", $Menu)
GUISetState()
While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $AboutItem
			_About($Title, $MainLabel, $CopyRLabel, "v1.0", $NameURL1, $URL1, $NameURL2, $URL2, $NameURL3, $URL3, @AutoItExe, $LinkColor, $BkColor, -1, -1, -1, -1, $ParentGui)
	EndSwitch
WEnd
Func _About($Title, $MainLabel, $CopyRLabel, $VerLabel, $NameURL1, $URL1, $NameURL2, $URL2, $NameURL3, $URL3, $IconFile="", $LinkColor=0x0000FF, $BkColor=0xFFFFFF, $Left=-1, $Top=-1, $Style=-1, $ExStyle=-1, $Parent=0)
	Local $OldEventOpt = Opt("GUIOnEventMode", 0)
	Local $OldRunErrOpt = Opt("RunErrorsFatal", 0)
	Local $GUI, $LinkTop=120, $Msg, $CurInfo
	Local $CurIsOnCtrlArr[1]
	Local $LinkVisitedColor[4] = [3, $LinkColor, $LinkColor, $LinkColor]
	Local $LinkLabel[4]
	WinSetState($Parent, "", @SW_DISABLE)
	If $ExStyle = -1 Then $ExStyle = ""
	$GUI = GUICreate($Title, 320, 240, $Left, $Top, $Style, 0x00000080+$ExStyle, $Parent)
	GUISetBkColor($BkColor)
	GUICtrlCreateLabel($MainLabel, 40, 20, 280, 25, 1)
	GUICtrlSetFont(-1, 16)
	GUICtrlCreateIcon($IconFile, 0, 10, 20)
	GUICtrlCreateGraphic(5, 75, 310, 3, $SS_ETCHEDFRAME)
	For $i = 1 To 3
		$LinkLabel[$i] = GUICtrlCreateLabel(Eval("NameURL" & $i), 150, $LinkTop, 145, 15, 1)
		GUICtrlSetCursor(-1, 0)
		GUICtrlSetColor(-1, $LinkColor)
		GUICtrlSetFont(-1, 9, 400, 0)
		GUICtrlSetTip(-1, Eval("URL" & $i))
		$LinkTop += 30
	Next
	GUICtrlCreateLabel("Program version: " & @LF & $VerLabel, 10, 130, 150, 35, 1)
	GUICtrlSetFont(-1, 10, 600, 0, "Tahoma")
	GUICtrlCreateLabel($CopyRLabel, 0, 220, 320, -1, 1)
	GUISetState(@SW_SHOW, $GUI)
	While 1
		$Msg = GUIGetMsg()
		If $Msg = -3 Then ExitLoop
		For $i = 1 To 3
			If $Msg = $LinkLabel[$i] Then
				While 1
					GUISetCursor(0, 1, $GUI)
					If GUIGetMsg() = $GUI_EVENT_PRIMARYUP Then
						$CurInfo = GUIGetCursorInfo($GUI)
						If $CurInfo[4] = $LinkLabel[$i] Then
							GUISetCursor(-1, 0, $GUI)
							$LinkVisitedColor[$i] = 0xAC00A9
							GUICtrlSetColor($LinkLabel[$i], $LinkVisitedColor[$i])
							ShellExecute(Eval("URL" & $i))
						EndIf
						ExitLoop
					EndIf
				WEnd
				GUISetCursor(-1, 0, $GUI)
			EndIf
		Next
		If WinActive($GUI) Then
			For $i = 1 To 3
				ControlHover($GUI, $LinkLabel[$i], $i, $CurIsOnCtrlArr, 0xFF0000, $LinkVisitedColor[$i])
			Next
		EndIf
	WEnd
	WinSetState($Parent, "", @SW_ENABLE)
	GUIDelete($GUI)
	Opt("GUIOnEventMode", $OldEventOpt)
	Opt("RunErrorsFatal", $OldRunErrOpt)
EndFunc
Func ControlHover($hWnd, $CtrlID, $CtrlNum, ByRef $CurIsOnCtrlArr, $HoverColor=0xFF0000, $LinkColor=0x0000FF)
	Local $CursorCtrl = GUIGetCursorInfo($hWnd)
	ReDim $CurIsOnCtrlArr[UBound($CurIsOnCtrlArr)+1]
	If $CursorCtrl[4] = $CtrlID And $CurIsOnCtrlArr[$CtrlNum] = 1 Then
		GUICtrlSetFont($CtrlID, 9, 400, 6)
		GUICtrlSetColor($CtrlID, $HoverColor)
		$CurIsOnCtrlArr[$CtrlNum] = 0
	ElseIf $CursorCtrl[4]  $CtrlID And $CurIsOnCtrlArr[$CtrlNum] = 0 Then
		GUICtrlSetFont($CtrlID, 9, 400, 0)
		GUICtrlSetColor($CtrlID, $LinkColor)
		$CurIsOnCtrlArr[$CtrlNum] = 1
	EndIf
EndFunc
Аватара пользователя
Diamond

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

Сообщение Diamond »

Пример Gui-оболочки для консольных конверторовУ меня накопилось с десяток консольных программ типа: архиваторы, конверторы звуковых и графических файлов и т.п. и я подумал, что неплохо было бы для них написать Gui.

Цели, которые я поставил при написании:

1. Список для добавляемых файлов должен быть ListView, при чем с поддержкой перетаскивания файлов (Drag&Drop)

2. Каждый новый Файл должен добавляться в конец списка, а как следствие - сортировка ListView запрещена.

3. В списке не должно быть дубликатов файловых путей.



Это только стартовый интерфейс, но надеюсь он кому-то сэкономит время в написании подобных программ. Изображение

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

#include <GUIConstants.au3>
#include <GuiListView.au3>
Opt("GUIOnEventMode",1)
Opt("TrayIconHide",1)
Global Const $WM_DROPFILES = 0x233
Global $StringCount=0
Global $Dict=ObjCreate("Scripting.Dictionary") ; <- Словарь
$hGUI=GUICreate("Конвертор ;)",600,500,-1,-1,-1,$WS_EX_ACCEPTFILES)
	GUISetOnEvent($GUI_EVENT_CLOSE,"Quit")
$listview=GUICtrlCreateListView  ("Файл|Путь",5,5,590,450,BitOR($LVS_NOSORTHEADER,$LVS_SHOWSELALWAYS))
$ButtonDelete=GUICtrlCreateButton("Удалить",250,465,80,24)
	GUICtrlSetOnEvent(-1,"StrDelete")
$ButtonAdd=GUICtrlCreateButton("Добавить",120,465,80,24)
	GUICtrlSetOnEvent(-1,"AddOpenFiles")
GUISetState(@SW_SHOWNORMAL)
;~ Регистрируем событие Drag&Drop
GUIRegisterMsg ($WM_DROPFILES, "DropFiles")
While 1
	Sleep(1000)
WEnd
;~ Выход из приложения
Func Quit()
	Exit(0)
EndFunc
;~ Этот функция была взята с официального форума или... точно не помню ;)
;~ Создаёт массив $gaDropFiles, из файлов полученный при перетаскивании
;~ Вызывается событием, прописанным в GUIRegisterMsg()
Func DropFiles($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName, $gaDropFiles[1]
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
        $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
        $nSize = $nSize[0] + 1
        $pFileName = DllStructCreate("char[" & $nSize & "]")
        DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
        ReDim $gaDropFiles[$i+1]
        $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
        $pFileName = 0
    Next
	Call ("AddDropedFiles", $gaDropFiles)
EndFunc
;~ Добавляет в ListViev файлы, полученные с помощью перетаскивания (Drag&Drop)
;~ Является продолжением функции DropFiles()
Func AddDropedFiles($gaDropFiles)
	Call ("DictionaryAdd")
	Local $Count=$StringCount
	For $o In $gaDropFiles
		If Not $Dict.Exists($o) Then
			_GUICtrlListViewInsertItem($listview, $Count, GetFileName($o) & '|' & $o)
			Call ("AutoSize")
			$Count=$Count+1
		EndIf
	Next
	$Dict.RemoveAll
EndFunc
;~ Добавляет файлы в ListViev с помощью FileOpenDialog()
;~ Вызывается кнопкой
Func AddOpenFiles()
	$FilePath = FileOpenDialog("Открыть","","Wave файлы (*.wav) | Все файлы (*.*)",4+1)
	If @error <> 1 Then
		Local $array = StringSplit($FilePath, "|")
		Local $Count = $StringCount
		If $array[0]>1 Then
			$path=$array[1]
			Call ("DictionaryAdd")
			For $i=2 To $array[0]
				$FullPath=$path & "\" & $array[$i]
				If Not $Dict.Exists($FullPath) Then
					_GUICtrlListViewInsertItem($listview, $Count, $array[$i] & '|' & $FullPath)
					Call ("AutoSize")
					$Count=$Count+1
				EndIf
			Next
		ElseIf $array[0]=1 Then
			Call ("DictionaryAdd")
			If Not $Dict.Exists($array[1]) Then
				_GUICtrlListViewInsertItem($listview, $StringCount, GetFileName($array[1]) & '|' & $array[1])
				Call ("AutoSize")
			Endif
		EndIf
		$Dict.RemoveAll
	EndIf
EndFunc
;~ Удаляет выбранные элементы в ListViev
;~ Вызывается кнопкой
Func StrDelete()
	_GUICtrlListViewDeleteItemsSelected($listview)
	If _GUICtrlListViewGetItemCount($listview) Then AutoSize()
EndFunc
;~ ========================
;~ Вспомогательные функции:
;~ ========================
; Возвращает имя файла или папки из пути
;~ Вызывается некоторыми функциями
Func GetFileName($FilePath)
	If StringRight($FilePath,1)="\" Then
		$FilePath=StringTrimRight($FilePath,1)
	EndIf
	Return StringTrimLeft($FilePath,StringInStr($FilePath,"\",0,-1))
EndFunc
;~ Изменяет размеры колонок в ListViev
;~ Вызывается некоторыми функциями
Func AutoSize()
_GUICtrlListViewSetColumnWidth($listview,1,$LVSCW_AUTOSIZE)
_GUICtrlListViewSetColumnWidth($listview,0,$LVSCW_AUTOSIZE)
EndFunc
;~ Добавляет в словарь все элементы второй колонки ListViev (Пути к файлам)
;~ З.Ы. Поиск дубликатов по словарю, значительно быстрее чем перебор-сравнение в массиве!
Func DictionaryAdd()
	$StringCount=_GUICtrlListViewGetItemCount($listview)
	For $i=0 To $StringCount
		$Item = _GUICtrlListViewGetItemTextArray ($listview, $i)
		If IsArray($Item) Then 
			$Dict.Add($Item[2],"")
		EndIf
	Next
EndFunc
;~ ---------------------------------------------
;~ Позволят получить файловое расширение из пути или имени файла.
;~ Это единственная функция которая нигде не используется!
Func FileGetExtension($name)
	Local $Count=StringInStr($name,".",0,-1)
	If $Count=0 Then
		Return 0
	Else
		Return StringTrimLeft($name,$Count)
	EndIf
EndFunc
Аватара пользователя
Creat0R

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

Сообщение Creat0R »

Diamond


Цитата:



Этот функция была взята с официального форума или... точно не помню Изображение



Да да, иименно от туда, я и сам ей пользуюсь с удовольствием Изображение, взял тоже именно с оф. форума (её наисал кажется gafrost).



У меня почему то при вызове $dict.Exists скрипт выпадает с ошибкой:




Цитата:



The requested action with this object has failed.



Вобщем я немного изменил скрипт, надеюсь что в лучшую сторону, изменения таковы:



-Функцию _FileOpenDialog() добавил самдельную (от amel27) - позволяет открыть диалог для выбора файла как дочерний диалог ГУИ.



-Добавил функцию для поиска в самом ListView, имхо, так надёжнее, и не так уж намного медленнее Изображение



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



-Теперь при добавлении файлов используя перетаскивание, существующие в списке файлы будут подсвечиваться (выделяться) - так думаю более удобно Изображение.



-Функцию GetFileName() немного укоротил Изображение



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



-Чтобы можно было присваивать иконки айтемам, пришлось вместо вставки айтемов, создавать их встроенными средствами, т.к требуется ControlID.



Вот что получилось:



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

#include <GUIConstants.au3>
#include <GuiListView.au3>
Opt("GUIOnEventMode",1)
Opt("TrayIconHide",1)
Global Const $WM_DROPFILES = 0x233
Global $StringCount=0
Global $Dict=ObjCreate("Scripting.Dictionary") ; <- Словарь
$hGUI=GUICreate("Конвертор ;)",600,500,-1,-1,-1,$WS_EX_ACCEPTFILES)
	GUISetOnEvent($GUI_EVENT_CLOSE,"Quit")
$listview=GUICtrlCreateListView  ("Файл|Путь",5,5,590,450,BitOR($LVS_NOSORTHEADER,$LVS_SHOWSELALWAYS))
$ButtonDelete=GUICtrlCreateButton("Удалить",250,465,80,24)
	GUICtrlSetOnEvent(-1,"StrDelete")
$ButtonAdd=GUICtrlCreateButton("Добавить",120,465,80,24)
	GUICtrlSetOnEvent(-1,"AddOpenFiles")
GUISetState(@SW_SHOWNORMAL)
;~ Регистрируем событие Drag&Drop
GUIRegisterMsg ($WM_DROPFILES, "DropFiles")
While 1
	Sleep(1000)
WEnd
;~ Выход из приложения
Func Quit()
	Exit(0)
EndFunc
;~ Этот функция была взята с официального форума или... точно не помню ;)
;~ Создаёт массив $gaDropFiles, из файлов полученный при перетаскивании
;~ Вызывается событием, прописанным в GUIRegisterMsg()
Func DropFiles($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName, $gaDropFiles[1]
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
        $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
        $nSize = $nSize[0] + 1
        $pFileName = DllStructCreate("char[" & $nSize & "]")
        DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
        ReDim $gaDropFiles[$i+1]
        $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
        $pFileName = 0
    Next
	Call ("AddDropedFiles", $gaDropFiles)
EndFunc
;~ Добавляет в ListViev файлы, полученные с помощью перетаскивания (Drag&Drop)
;~ Является продолжением функции DropFiles()
Func AddDropedFiles($gaDropFiles)
	Local $SelCount = 1, $LVIID, $IconFile, $IconID
	For $o In $gaDropFiles
		$FindPathInLV = _FindInListView($listview, 1, $o)
		If $FindPathInLV = -1 Then
			$LVIID = GUICtrlCreateListViewItem(GetFileName($o) & '|' & $o, $listview)
			_FileGetIcon($IconFile, $IconID, $o)
			GUICtrlSetImage($LVIID, $IconFile, $IconID)
		Else
			If $SelCount = 1 Then ControlListView($hGUI, "", $listview, "SelectClear")
			_GUICtrlListViewSetItemSelState($listview, $FindPathInLV)
			$SelCount = -1
		EndIf
	Next
	If $SelCount = -1 Then ControlFocus($hGUI, "", $listview)
	Call ("AutoSize")
EndFunc
;~ Добавляет файлы в ListViev с помощью FileOpenDialog()
;~ Вызывается кнопкой
Func AddOpenFiles()
	$FilePath = _FileOpenDialog("Открыть","","Wave файлы (*.wav) | Все файлы (*.*)",4+1, "", "", $hGUI)
	If Not @error Then
		$FilePath = StringStripCR($FilePath)
		Local $array = StringSplit($FilePath, "|")
		Local $LVIID, $IconFile, $IconID
		If $array[0]>1 Then
			$path=$array[1]
			For $i=2 To $array[0]
				$FullPath=$path & "\" & $array[$i]
				If _FindInListView($ListView, 1, $FullPath) = -1 Then
					$LVIID = GUICtrlCreateListViewItem($array[$i] & '|' & $FullPath, $listview)
					_FileGetIcon($IconFile, $IconID, $FullPath)
					GUICtrlSetImage($LVIID, $IconFile, $IconID)
				EndIf
			Next
		ElseIf $array[0]=1 Then
			If _FindInListView($ListView, 1, $array[1]) = -1 Then
				$LVIID = GUICtrlCreateListViewItem(GetFileName($array[1]) & '|' & $array[1], $listview)
				_FileGetIcon($IconFile, $IconID, $array[1])
				GUICtrlSetImage($LVIID, $IconFile, $IconID)
			EndIf
		EndIf
		Call ("AutoSize")
	EndIf
EndFunc
;~ Удаляет выбранные элементы в ListViev
;~ Вызывается кнопкой
Func StrDelete()
	_GUICtrlListViewDeleteItemsSelected($listview)
	If _GUICtrlListViewGetItemCount($listview) Then AutoSize()
EndFunc
;~ ========================
;~ Вспомогательные функции:
;~ ========================
; Возвращает имя файла или папки из пути
;~ Вызывается некоторыми функциями
Func GetFileName($FilePath)
	Return StringRegExpReplace($FilePath, "^.*\\", "")
EndFunc
;~ Изменяет размеры колонок в ListViev
;~ Вызывается некоторыми функциями
Func AutoSize()
_GUICtrlListViewSetColumnWidth($listview,1,$LVSCW_AUTOSIZE)
_GUICtrlListViewSetColumnWidth($listview,0,$LVSCW_AUTOSIZE)
EndFunc
;~ Добавляет в словарь все элементы второй колонки ListViev (Пути к файлам)
;~ З.Ы. Поиск дубликатов по словарю, значительно быстрее чем перебор-сравнение в массиве!
Func DictionaryAdd()
	$StringCount=_GUICtrlListViewGetItemCount($listview)
	For $i=0 To $StringCount
		$Item = _GUICtrlListViewGetItemTextArray ($listview, $i)
		If IsArray($Item) Then 
			$Dict.Add($Item[2],"")
		EndIf
	Next
EndFunc
;~ Функция производит поиск в списке List View, в случае удачи, возвращает индекс найденного айтема в списке,
;в противном случае возвращает -1
Func _FindInListView($ListViewID, $SubItem, $WhatToFind, $SubItem2=-1, $WhatToFind2="")
	Local $TotalItemsArr = _GUICtrlListViewGetItemCount($ListViewID)
	Local $CurrentText, $CurrentText2
	If $TotalItemsArr > 0 Then
		For $i = 0 To $TotalItemsArr - 1
			$CurrentText = _GUICtrlListViewGetItemText($ListViewID, $i, $SubItem)
			If $SubItem2 <> -1 Then
				$CurrentText2 = _GUICtrlListViewGetItemText($ListViewID, $i, $SubItem2)
				If $CurrentText = $WhatToFind And $CurrentText2 = $WhatToFind2 Then Return $i
			Else
				If $CurrentText = $WhatToFind Then Return $i
			EndIf
		Next
	EndIf
	Return -1
EndFunc
;~ Самодельная функци FileOpenDialog() - позволяет открыть диалог для выбора файла как дочерний диалог ГУИ.
Func _FileOpenDialog($sTitle, $sInitDir, $sFilter = 'All (*.*)', $iOpt = 0, $sDefaultFile = "", $sDefaultExt = "", $mainGUI = 0)
    Local $iFileLen = 65536 ; Max chars in returned string
    ; API flags prepare
    Local $iFlag = BitOR ( _
        BitShift (BitAND ($iOpt, 1),-12), BitShift (BitAND ($iOpt, 2),-10), BitShift (BitAND ($iOpt, 4),-7 ), _
        BitShift (BitAND ($iOpt, 8),-10), BitShift (BitAND ($iOpt, 4),-17) )
    ; Filter string to array convertion
    Local $asFLines = StringSplit ( $sFilter, '|'), $asFilter [$asFLines [0] *2+1]
    Local $i, $iStart, $iFinal, $suFilter = ''
    $asFilter [0] = $asFLines [0] *2
    For $i=1 To $asFLines [0]
        $iStart = StringInStr ($asFLines [$i], '(', 0, 1)
        $iFinal = StringInStr ($asFLines [$i], ')', 0,-1)
        $asFilter [$i*2-1] = StringStripWS (StringLeft ($asFLines [$i], $iStart-1), 3)
        $asFilter [$i*2] = StringStripWS (StringTrimRight (StringTrimLeft ($asFLines [$i], $iStart), StringLen ($asFLines [$i]) -$iFinal+1), 3)
        $suFilter = $suFilter & 'byte[' & StringLen ($asFilter [$i*2-1])+1 & '];byte[' & StringLen ($asFilter [$i*2])+1 & '];'
    Next
    ; Create API structures
    Local $uOFN = DllStructCreate ('dword;int;int;ptr;ptr;dword;dword;ptr;dword' & _
        ';ptr;int;ptr;ptr;dword;short;short;ptr;ptr;ptr;ptr;ptr;dword;dword' )
    Local $usTitle  = DllStructCreate ('byte[' & StringLen ($sTitle) +1 & ']')
    Local $usInitDir= DllStructCreate ('byte[' & StringLen ($sInitDir) +1 & ']')
    Local $usFilter = DllStructCreate ($suFilter & 'byte')
    Local $usFile   = DllStructCreate ('byte[' & $iFileLen & ']')
    Local $usExtn   = DllStructCreate ('byte[' & StringLen ($sDefaultExt) +1 & ']')
    For $i=1 To $asFilter [0]
        DllStructSetData ($usFilter, $i, $asFilter [$i])
    Next
    ; Set Data of API structures
    DllStructSetData ($usTitle, 1, $sTitle)
    DllStructSetData ($usInitDir, 1, $sInitDir)
    DllStructSetData ($usFile, 1, $sDefaultFile)
    DllStructSetData ($usExtn, 1, $sDefaultExt)
    DllStructSetData ($uOFN,  1, DllStructGetSize($uOFN))
    DllStructSetData ($uOFN,  2, $mainGUI)
    DllStructSetData ($uOFN,  4, DllStructGetPtr ($usFilter))
    DllStructSetData ($uOFN,  7, 1)
    DllStructSetData ($uOFN,  8, DllStructGetPtr ($usFile))
    DllStructSetData ($uOFN,  9, $iFileLen)
    DllStructSetData ($uOFN, 12, DllStructGetPtr ($usInitDir))
    DllStructSetData ($uOFN, 13, DllStructGetPtr ($usTitle))
    DllStructSetData ($uOFN, 14, $iFlag)
    DllStructSetData ($uOFN, 17, DllStructGetPtr ($usExtn))
    DllStructSetData ($uOFN, 23, BitShift (BitAND ($iOpt, 32), 5))
    ; Call API function
    $ret = DllCall ('comdlg32.dll', 'int', 'GetOpenFileName', _
            'ptr', DllStructGetPtr ($uOFN) )
    If $ret [0] Then
        If BitAND ($iOpt, 4) Then
            $i = 1
            While 1
                If DllStructGetData ($usFile, 1, $i) =0 Then
                    If DllStructGetData ($usFile, 1, $i+1) Then
                         DllStructSetData ($usFile, 1, 124, $i)
                    Else
                        ExitLoop
                    EndIf
                EndIf
                $i += 1
            Wend
        EndIf
        Return DllStructGetData ($usFile, 1)
    Else
        SetError (1)
        Return ""
    EndIf
EndFunc
;~ Функция задаёт значения для переменных $szIconFile и $nIcon путь к файлу и идентификатор иконки в файле
; (для определения иконки по заданному пути к файлу).
Func _FileGetIcon(ByRef $szIconFile, ByRef $nIcon, $szFile)
	Local $OldEES = Opt("ExpandEnvStrings", 1)
	Local $szRegDefault = "", $szDefIcon = "", $szExt
	$nIcon = 0
	If _IsDir($szFile) Then
		$szRegDefault = RegRead("HKCR\Folder", "")
		If $szRegDefault <> "" Then $szDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
	Else
		$szExt = StringRegExpReplace($szFile, '^.*\.', '.')
		If $szExt = $szFile Then
			$szExt = FileFindFirstFile($szFile & ".*")
			$szExt = StringRegExpReplace(FileFindNextFile($szExt), '^.*\.', '.')
			$szFile = $szFile & $szExt
		EndIf
		$szRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $szExt, "ProgID")
		If $szRegDefault = "" Then $szRegDefault = RegRead("HKCR\" & $szExt, "")
		If $szRegDefault <> "" Then $szDefIcon = RegRead("HKCR\" & $szRegDefault & "\DefaultIcon", "")
	EndIf
	If $szDefIcon = "" Then
		$szIconFile = "shell32.dll"
	ElseIf $szDefIcon <> "%1" Then
		If StringRegExpReplace($szFile, "^.*\\", "") = "shell32.dll" Then
			$szIconFile = $szFile
			$nIcon = 0
		Else
			$arSplit = StringSplit($szDefIcon, ",")
			If IsArray($arSplit) Then
				$szIconFile = $arSplit[1]
				If $arSplit[0] > 1 Then $nIcon = $arSplit[2]
			Else
				Opt("ExpandEnvStrings", $OldEES)
				Return 0
			EndIf
		EndIf
	ElseIf $szDefIcon = "%1" Then
		$szIconFile = $szFile
		$nIcon = 0
	EndIf
	Opt("ExpandEnvStrings", $OldEES)
	Return 1
EndFunc
;~ Функция предназначена для проверки, является ли заданый путь каталогом.
Func _IsDir($Path)
	Return StringInStr(FileGetAttrib($Path), "D")
EndFunc
;~ ---------------------------------------------
;~ Позволят получить файловое расширение из пути или имени файла.
;~ Это единственная функция которая нигде не используется!
Func FileGetExtension($name)
	Local $Count=StringInStr($name,".",0,-1)
	If $Count=0 Then
		Return 0
	Else
		Return StringTrimLeft($name,$Count)
	EndIf
EndFunc
Аватара пользователя
Creat0R

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

Сообщение Creat0R »

Есть такой вопрос:



Утилита
OpenedFilesView
, “умеет просматривать” файлы которые заняты разными приложениями...

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



Также программа отображает полный путь к приложению которое “держит” эти файлы...



Вопрос в том, возможно ли и на AutoIt получить доступ к подобной информации, а также иметь возможность закрывать Handles файлов, или временно их неитрализовывать (чего в самой программе нет Изображение )?



Полагаю тут надо копать в сторону DllCall, но я даже и не знаю какой “тип лопаты” выбрать Изображение



P.S

На оф. форуме поднимался подобный вопрос, но до сих пор так ни кто и не нашёл решения, надеюсь среди наших, найдутся знатоки и умеющие хорошо копать люди Изображение
Аватара пользователя
gregaz

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

Сообщение gregaz »

Просьба помочь "чайнику" AutoItа

Надоело вариться в собственном соку



Как правильно организовать скрипт с использованием GUI ?

Хотел обратиться раньше,но решил сначала немного самому пощупать(и не без пользы .оказывается)

Просьба показать на примере,содержащем следующее :



1.Создается окно GUI



2.В нем создаются :

- пара текстовых строк (наверное Label 1 - Label 2)

- пара кнопок ( скажем button 1-Button 2)



3.При нажатии кнопки button 1:

- предыдущая инфа стирается

- создается :

- пара новых текстовых строк

- пара элементов Input ( с каким то текстом )

- пара новых кнопок ( скажем Read-Save)

- при нажатии новой кнопки Read :

- выводится инфа до редактирования текста в окнах Input(Слева в окне GUI)

- при нажатии новой кнопки Save :

- выводится инфа после редактирования текста в окнах Input (Справа в окне GUI)



4.При нажатии кнопки button 2:

- Все окно очищается

- Выводится любая обобщающая информация



Из примера хотелось бы понять :



1.Как правильно вводить текст и очищать окно

2.Как правильно организовать опрос элементов GUI при наличии вновь появляющихся

элементов (кнопок Read-Save,элементов Input и т.п. )

3.Как правильно осуществлять поиск по данной теме форума

Заранее благодарен
Аватара пользователя
Creat0R

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

Сообщение Creat0R »

gregaz


Цитата:



Просьба показать на примере,содержащем следующее



Вот пример:





Код:

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

Global $Input1, $Input2, $ReadButton=-1, $SaveButton=-1
$Gui = GUICreate("Demo GUI", 400, 300)
$Label1 = GUICtrlCreateLabel("Строка 1", 20, 50, 300)
$Label2 = GUICtrlCreateLabel("Строка 2", 20, 100, 300)
$Button1 = GUICtrlCreateButton("Button1", 100, 260, 70)
$Button2 = GUICtrlCreateButton("Button2", 250, 260, 70)
GUISetState()
While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button1 ;нажата кнопка "Button1"
            ;Нажата кнопка "Button1", а значит стираем инфу и вместо неё пишем другую
            ;(можно конечно удалять контроли и создавать новые, но не вижу в этом смысла ;) )...
            GUICtrlSetData($Label1, "Новая строка 1")
            GUICtrlSetData($Label2, "Новая строка 2")
                        ;Создаём поля ввода
            $Input1 = GUICtrlCreateInput("Поле ввода 1", 20, 140, 300)
            $Input2 = GUICtrlCreateInput("Поле ввода 2", 20, 180, 300)
                        ;Создаём кнопки Read-Save
            $ReadButton = GUICtrlCreateButton("Read", 100, 220, 70)
            $SaveButton = GUICtrlCreateButton("Save", 250, 220, 70)
        Case $Button2 ;нажата кнопка "Button2"
            ;Удаляем всё кроме кнопок "Button1" и "Button2"
            GUICtrlDelete($Label1)
            GUICtrlDelete($Label2)
            GUICtrlDelete($Input1)
            GUICtrlDelete($Input2)
            GUICtrlDelete($ReadButton)
            GUICtrlDelete($SaveButton)
        Case $ReadButton ;нажата кнопка "Read"
            ;Выводим тот текст что создали (я так понял это нужно?)
            MsgBox(64, "Info", "Поле ввода 1" & @LF & "Поле ввода 2")
        Case $SaveButton ;нажата кнопка "Save"
            ;Выводим то что в полях ввода
            $ReadInput1 = GUICtrlRead($Input1)
            $ReadInput2 = GUICtrlRead($Input2)
            MsgBox(64, "Info", $ReadInput1 & @LF & $ReadInput2)
    EndSwitch
WEnd


Цитата:



Как правильно вводить текст и очищать окно



Это очень сильно зависит от конкретного случая... можно удалить все созданные контроли, но можно и просто очистить данные (GuiCtrlSetData($ControlID, ""), но это также зависит от типа контроля (поле ввода, чекбокс, и т.д).




Цитата:



Как правильно организовать опрос элементов GUI при наличии вновь появляющихся



В каком смысле опрос элементов? чтобы иметь к ним доступ? я это привёл в примере, те контроли, что создаются позже в цикле, нужно заранее обьявить, и желательно со значениями не ровняющимися нулю (0) - типичное поведение переменных обьявленых без значения.




Цитата:



Как правильно осуществлять поиск по данной теме форума



Лучше всего переключить в режим печати (
ВСЕ
), и искать на странице (Ctrl F Изображение).
Аватара пользователя
Diamond

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

Сообщение Diamond »

Creat0R

Рукописная функция _FileOpenDialog у меня возвращает цифры 0x433A5C446F63756D... и т.п. и очень много нулей. Изображение


Цитата:



У меня почему то при вызове $dict.Exists скрипт выпадает с ошибкой



А в отдельном скрипте сам объект не пробовал тестировать?


Цитата:



-Добавил функцию для поиска в самом ListView, имхо, так надёжнее, и не так уж намного медленнее



Разница в скорости станет очевидной при обработке больших объёмов информации. ИМХО "Scripting.Dictionary" очень даже надёжен и я принципиально не хочуИзображение от него отказываться. Изображение


Цитата:



иконки определяются используя функцию _FileGetIcon()



Я уже начал писать нечто подобное, вот только не знал как получить иконку для папки. Спасибо.


Цитата:



вызывается AutoSize на каждый добавляемый файл, хотя логичнее бдет вызвать один раз эту функцию по оканчанию добавления всех файлов.



... уже думал об этом, но потом решил что это не сильно отразиться на скорости добавления - возможно я и не прав... Изображение


Цитата:



-Чтобы можно было присваивать иконки айтемам, пришлось вместо вставки айтемов, создавать их встроенными средствами, т.к требуется ControlID.



Спасибо, буду разбираться. Изображение
Аватара пользователя
Diamond

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

Сообщение Diamond »

Creat0R


Цитата:



Полагаю тут надо копать в сторону DllCall, но я даже и не знаю какой “тип лопаты” выбрать



По поводу лопаты... Думаю, нужно копать в сторону файловых дескрипторов.

Скорее всего, программе удаётся это сделать за счёт подмены или переназначения блокирующего дескриптора, для своего собственного процесса.

К сожалению, больше ничем помочь не смогу... Изображение
Аватара пользователя
gregaz

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

Сообщение gregaz »

Creat0R !

Спасибо за помощь !

Многое стало понятнее .



Естественно сразу возникли вопросы :



1. Почему даный пример работает даже без обьявления #include ?



2. Правильно ли я понял ,что обявление Global переменных нужно только лишь для Обьявления

начальных значений еще не созданных элементов ( можно наверное и так : $Input1 ="" и т.д.) ?



3. Цикл Switch-Case-EndSwitch полностью аналогичен циклу Select-Case-EndSelect или есть отличия ?

Можно ли здесь поменять их ?



4. Что означает Case -3 (GUIGetMsg()= -3 ) ? Когда появится это значение ?



5. Правильно ли я понял ,что независимо от появляющихся впоследствии элементов GUI , опрос

об их состояниях (значениях) производится ВСЕГДА в одном общем цикле While-Wend ?

Я пытался после создания новых элементов создавать еще внутренний цикл While-Wend ,поскольку иначе они

почему то получались статическими.



6. Можно ли вместо вывода информации в окне MsgBox осуществлять вывод в том же окне GUI ?



7.Можно ли для очиски окна использовать GUICtrlDelete($ControlID) или GuiCtrlSetData($ControlID, "") - что правильнее ?



8. Как праильно осуществлять поиск ранее обсуждавшихся вопросов на форуме ( не на странице) ?



Извините что напрягаю.
Ответить

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