|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты |
|
[Архив - Часть 1.3] AutoIt скрипты
|
Старожил Сообщения: 250 |
Внимание! Тема переведена в архивное состояние (настоятельно рекомендуется к прочтению/поиску) Руководство к действию по работе 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 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать ChVL
Цитата:
Цитата:
![]() |
||
------- Отправлено: 21:43, 04-06-2007 | #481 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Функции (и пример использования) для отображения стильного диалога “О Программе” #include <GUIConstants.au3> $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 |
------- Отправлено: 02:40, 06-06-2007 | #482 |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Пример 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 |
Отправлено: 18:52, 06-06-2007 | #483 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Diamond
Цитата:
![]() У меня почему то при вызове $dict.Exists скрипт выпадает с ошибкой: Цитата:
-Функцию _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 |
||
------- Отправлено: 22:17, 06-06-2007 | #484 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Есть такой вопрос:
Утилита OpenedFilesView, “умеет просматривать” файлы которые заняты разными приложениями... Среди прочих возможностей программы, она имеет весьма удобную функцию - закрывать файлы (их Handle), чтобы к примеру, можно было удалить/переместить/переименовать файл без проблем, или изменить в нём данные. Также программа отображает полный путь к приложению которое “держит” эти файлы... Вопрос в том, возможно ли и на AutoIt получить доступ к подобной информации, а также иметь возможность закрывать Handles файлов, или временно их неитрализовывать (чего в самой программе нет ![]() Полагаю тут надо копать в сторону DllCall, но я даже и не знаю какой “тип лопаты” выбрать ![]() P.S На оф. форуме поднимался подобный вопрос, но до сих пор так ни кто и не нашёл решения, надеюсь среди наших, найдутся знатоки и умеющие хорошо копать люди ![]() |
------- Отправлено: 02:13, 07-06-2007 | #485 |
![]() Пользователь Сообщения: 88
|
Профиль | Отправить PM | Цитировать Просьба помочь "чайнику" 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.Как правильно осуществлять поиск по данной теме форума Заранее благодарен |
Отправлено: 12:22, 07-06-2007 | #486 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать 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 Цитата:
Цитата:
Цитата:
![]() |
||||
------- Отправлено: 14:59, 07-06-2007 | #487 |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Creat0R
Рукописная функция _FileOpenDialog у меня возвращает цифры 0x433A5C446F63756D... и т.п. и очень много нулей. ![]() Цитата:
Цитата:
![]() ![]() Цитата:
Цитата:
![]() Цитата:
![]() |
|||||
Отправлено: 16:33, 07-06-2007 | #488 |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
Скорее всего, программе удаётся это сделать за счёт подмены или переназначения блокирующего дескриптора, для своего собственного процесса. К сожалению, больше ничем помочь не смогу... ![]() |
|
Отправлено: 17:43, 07-06-2007 | #489 |
![]() Пользователь Сообщения: 88
|
Профиль | Отправить PM | Цитировать Creat0R !
Спасибо за помощь ! Многое стало понятнее . Естественно сразу возникли вопросы : 1. Почему даный пример работает даже без обьявления #include <GUIConstants.au3> ? 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. Как праильно осуществлять поиск ранее обсуждавшихся вопросов на форуме ( не на странице) ? Извините что напрягаю. |
Отправлено: 18:22, 07-06-2007 | #490 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 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 |
|