Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
gregaz
Действительно есть,оказывается <Руководство по консольной версии RAR > - там все прописаноЯ имел ввиду консольную справку (cmd /k "Rar.exe" /?), а о том, что есть руководство, я почему-то не подумал... :sorry:
proxy
как быть?
Если для GUICtrlCreateListView поставить GUICtrlSetOnEvent, то оно срабатывать будет при нажатии на заголовок (Column), для того чтобы срабатывало при нажатии в пустом (точнее в любом) месте ListView, нужно совместить события (нажатие мышки и наведение курсора мышки над ListView контролем)...
#include <GuiConstants.au3>
Opt("GuiOnEventMode", 1)
$GUI = GUICreate("Test")
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "LV_Event")
$ListViewID = GUICtrlCreateListView("Column", 20, 40)
GUISetState()
While 1
Sleep(10)
WEnd
Func LV_Event()
Local $CursorInfoArr = GUIGetCursorInfo($GUI)
If $CursorInfoArr[4] = $ListViewID Then MsgBox(0, "", "Ok, List View was Clicked")
EndFunc
Func Quit()
Exit
EndFunc
точно также и с табами:
#include <GuiConstants.au3>
Opt("GuiOnEventMode", 1)
$GUI = GUICreate("Test")
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "Tab_Event")
$TabID = GUICtrlCreateTab(20, 40)
GUICtrlCreateTabItem("Tab Item")
GUISetState()
While 1
Sleep(10)
WEnd
Func Tab_Event()
Local $CursorInfoArr = GUIGetCursorInfo($GUI)
If $CursorInfoArr[4] = $TabID Then MsgBox(0, "", "Ok, Tab control was Clicked")
EndFunc
Func Quit()
Exit
EndFunc
объект: "Scripting.Dictionary" - Сортировка данных в словаре
Использование:
SortDictionary($objDict, flag)
$objDict - словарь (как объект)
flag - 0 сортировка по ключам(key); 1 сортировка по элементам(item)$Dict = ObjCreate("Scripting.Dictionary")
;~ Наполняем словарь неотсортированными данными:
$Dict.Add ("3", "Delta")
$Dict.Add ("1", "Foxtrot")
$Dict.Add ("4", "Bravo")
$Dict.Add ("2", "Echo")
$Dict.Add ("6", "Alpha")
$Dict.Add ("5", "Charlie")
;~ Сортировка:
SortDictionary($Dict, 0)
;~ Просмотр результатов сортировки:
For $o In $Dict
MsgBox(0+262144 ,$o, $Dict($o) )
Next
;~ Эта функция основана на:
;~ http://support.microsoft.com/support/kb/articles/q246/0/67.asp
Func SortDictionary(ByRef $objDict, $intSort=0)
Local Const $dictKey = 0
Local Const $dictItem = 1
Local $strDict[1]
Local $objKey
Local $strKey, $strItem
Local $intCount, $i, $j
$intCount = $objDict.Count
If $intCount > 1 Then
ReDim $strDict[$intCount][2]
$i = 0
For $objKey In $objDict
$strDict[$i][$dictKey] = String($objKey)
$strDict[$i][$dictItem] = String($objDict($objKey))
$i = $i + 1
Next
For $i = 0 To $intCount-2
For $j = $i To $intCount-1
If StringCompare($strDict[$i][$intSort], $strDict[$j][$intSort]) > 0 Then
$strKey = $strDict[$i][$dictKey]
$strItem = $strDict[$i][$dictItem]
$strDict[$i][$dictKey] = $strDict[$j][$dictKey]
$strDict[$i][$dictItem] = $strDict[$j][$dictItem]
$strDict[$j][$dictKey] = $strKey
$strDict[$j][$dictItem] = $strItem
EndIf
Next
Next
$objDict.RemoveAll
For $i = 0 To $intCount-1
$objDict.Add ($strDict[$i][$dictKey], $strDict[$i][$dictItem])
Next
EndIf
EndFuncP.S. "Scripting.Dictionary" имеет свойства и методы которые делают его функциональней обычных массивов, плюс простота использования и высокая скорость обработки. А с этой функцией сортировки, словарь может стать серьёзным конкурентом для одномерных массивов.
Для тех кто не знаком с принципами работы этого объекта, есть хорошая ссылка, котрую дал мне Creat0R :http://www.autoitscript.com/forum/index.php?showtopic=47048&st=0&p=352256?entry352256
Также, описание свойств и методов можно найти на MSDN. (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/jsobjdictionary.asp?frame=true)
На офф. форуме нашел функцию (http://www.autoitscript.com/forum/index.php?showtopic=48008&hl=tab), которая казалось бы, воплотит в реальность мою давнюю “хотелку” :) ...
Вот функция:
Func SetParent($hWndChild, $hWndNewParent)
Local $vRtn = DllCall("USER32.DLL", "hwnd", "SetParent", "hwnd", $hWndChild, "hwnd", $hWndNewParent)
Return $vRtn[0]
EndFunc
Судя по её назваению и содержанию, я предположил что она позволяет присваивать одно окно к другому (в соотношении родительское-дочернее), и делая как бы дочернее окно “прикреплённым” к родительскому, но после долгих тестировании, присваивании якобы родительскому окну атрибута @SW_DISABLE и т.п, так ничего и не вышло :(.
Окно однако становится дочерним/родительским, но не так как мне этого хотелось...
В общем вопрос вот в чём: Возможно ли переделать эту функцию (или написать новую), которая позволит прикреплять одно окно к другому, также как это происходит при вызове подобной фкункции MsgBox...
$Hwnd = WinGetHandle(WinGetTitle(""))
_MsgBox(0, "", "", $Hwnd)
Func _MsgBox($MsgBoxType, $MsgBoxTitle, $MsgBoxText, $mainGUI="")
$ret = DllCall ("user32.dll", "int", "MessageBox", _
"hwnd", $mainGUI, _
"str", $MsgBoxText , _
"str", $MsgBoxTitle, _
"int", $MsgBoxType)
Return $ret [0]
EndFunc
Diamond
ИМХО у "Scripting.Dictionary" только одно преимущество перед массивами AutoIT - индекс может быть не только числовым, но и текстовым... другими словами это означает штатную поддержку _ArraySearch(), которая в AutoIT доступна только через UDF... Во всех остальных случаях не вижу причин для замены ими штатных массивов... Между прочим функция SortDictionary() по большому счету ничем не отличается от _ArraySort() (кроме отсутствия контроля ошибок), поэтому быстрей она работать не может по определению...
Подробно: http://www.osp.ru/win2000/2006/07/3643019
CreatorНа офф. форуме нашел функциюугу, видел эту функцию, только это не совсем то... а точней совсем не то:прикладная программа обычно использует дочерние окна, чтобы поделить рабочую область родительского окна на функциональные областит.е. грубо говоря применение это функции превращает окно в контрол другого окна, источник: http://www.firststeps.ru/mfc/winapi/win/r.php?18
schel4ok
20-06-2007, 11:19
А кто-нибудь знает как запускать inf файлы при помощи AutoIt?
Вообще-то, WinWaitActive() по умолчанию работает только с видимым текстом
Тогда я вообще ничего не понимаю :(.
Почему такая проверка:
if WinWaitActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету','5' )==1 Then
Send ( '{UP}{ENTER}' )
EndIf
не срабатывает
Если это окно не появляется, то нажатие стрелки вверх и энтера всё равно производится. В чем ошибаюсь, может как-то проверять надо другим способом?
amel27
ИМХО у "Scripting.Dictionary" только одно преимущество перед массивами AutoIT - индекс может быть не только числовым, но и текстовым... другими словами это означает штатную поддержку _ArraySearch(), которая в AutoIT доступна только через UDF... Во всех остальных случаях не вижу причин для замены ими штатных массивов...
Действительно, для "Scripting.Dictionary" функция _ArraySearch(), по большому счёту не нужна, поскольку он имеет метод Exists, но это не единственный его плюс. Например, чтобы произвести добавление, удаление или замену элементов, массивы используют UDF-функции, а при работе со словарём зависимость от UDF также отпадает.
Между прочим функция SortDictionary() по большому счету ничем не отличается от _ArraySort() (кроме отсутствия контроля ошибок), поэтому быстрей она работать не может по определению...
Если честно, я их ещё не сравнивал... А по поводу скорости, согласен, но я и не утверждал что она работает быстрее, ведь сам факт использования в ней массивов, говорит об обратном. Её плюс только в том, что она адаптирована для работы со словарём, и то что она компенсирует отсутствие штатной сортировки (что-то вроде udf, для "Scripting.Dictionary"). :)
хм....., если Creat0R это стиль жизни...то как же тебя именовать?
В любом случае, Человек живущий и создающий - Спаибо, уже витал ответ в голове но небыло времени проверить...
а так и бестрее и вернее выйдет ))) Продолжу вкладывать свои силы в подобный тебе стиль жизни.. )
В обычном режиме скрипт работает нормально: мелькают окна, но установка проходит автоматом до конца.
При использовании ключа /VERYSILENT идёт скрытый режим и натыкается на место, когда на экране одновременно два окна. Послать команду надо в верхнее окно, но скрипт его упорно не видит. Как победить?
Добавлено:
Разобрался. Оказалось, что это баг самой подопытной программы.
eNcub
Если это окно не появляется, то нажатие стрелки вверх и энтера всё равно производится. В чем ошибаюсь, может как-то проверять надо другим способом?
Странно... я проверил код, у меня всё нормально. :idontnow: на предыдущем шаге подключения, этот текст действительно есть, но он скрытый и при этом никаких нажатий не происходит...
Кто-нибудь знает в чём тут может быть проблема?
amel27
источник:
Спасибо, довольно полезный источник :) - Правда там нет кажется решения для моей хотелки :( ... оно вообще реализуемо?
schel4ok
как запускать inf файлы при помощи AutoIt?
ShellExecute("InfoFile.inf") запустит файл в редакторе для которого сопоставлено расширение файла *.inf в системе.
eNcub
Если это окно не появляется, то нажатие стрелки вверх и энтера всё равно производится
Попробуй так:
WinWaitActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету', 5)
If WinActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету') Then Send('{UP}{ENTER}')
ChVL
но скрипт его упорно не видит. Как победить?
Попробовать определить заголовок окна через Au3Info Tool? (при обычной установке).
Creat0R,спасибо за "толчок" в сторону функций _IE...
Я и не подозревал об их существовании
Их так много-целое направление в Autoite и богатые возможности (надо разбираться)
Пример поиска на ВЕБ-стр вроде бы работает
Надо будет ввести туда разбиение на строки.
Спасибо
Привет, ещё раз.
А как отслеить двойное нажатие правой и ливой кнопкой мыши?
по элименту.
хм.....и вопрос номер три, забыл спросить сразу.
имеется: файли txt со списком строк
необходимо: из этого файла удалить определенную строчку
я сейчас это реализовал так: т.е. считываю все строчки по одной из файла 1.txt
и если считанная строчка не совпадает с образцом, то записываю её в файл 2.txt
после оканчания файла 1.txt - удаляю его, а файл 2.txt переименовываю (т.е. копирую)
в файл 1.txt.
может есть вариант полегче?
Я считаю, что в пользовательской функции _FileReadToArray() допущена ошибка.
Рассматриваю строку из этой функции:
$aArray = StringSplit(StringStripCR(FileRead($hFile, FileGetSize($sFilePath))), @LF)
Поясню свою позицию. Дело в том, что строка текстового файла может иметь 3 типа завершения:
1 - @CRLF
2 - @CR
3 - @LF
Автор наверное посчитал что символ @LF - неотъемлемый элемент перевода на новую строку, и понадеявшись на него, одним махом удалил все @CR из полученного текста...
На деле же получается, что если строка завершается только символом @CR, то после такой обработки эта строка соединится со следующей, а в результате мы получим неверный массив.
Предлагаю свой вариант решения:
$aArray = StringSplit(StringRegExpReplace(FileRead($hFile,FileGetSize($sFilePath)),"\r\n|\n",@CR),@CR)
proxy
имеется: файли txt со списком строк
необходимо: из этого файла удалить определенную строчкуПример замены текста в файле: http://forum.oszone.net/post-533177-616.html
Diamond, спасибо. Необходимое с тектом реализовал уже по другому, а пример приму на заметку, чувствую дальше понадобиться.
И вопрос все ещё открыт:
Как отслеить двойное нажатие правой и ливой кнопкой мыши по элименту?
можеть есть пример?
Diamond
в результате мы получим неверный массив
Ну почему, в массив то попадают все строки с нужным текстом, а зачем в массиве символы перевода строки и возврата каретки?
И кстати, при чтении всего файла, совсем не обязательно использовать FileGetSize() :
$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\n",@CR),@CR)
А разве в этом примере символы перевода строки и возврата каретки не заменятся на символ новой строки? может при делении на массив нужно использовать @LF а не @CR?
proxy
Как отслеить двойное нажатие правой и ливой кнопкой мыши по элименту?
Вот пример для левой кнопки мышки (для правой пока не вкурсе) :
#include <GuiConstants.au3>
Opt("GuiOnEventMode", 1)
Global Const $WM_NOTIFY = 0x004E
Global Const $NM_CLICK = -2
Global Const $NM_DBLCLK = -3
$GUI = GUICreate("Dowble Click on List View", 300, 200)
GUISetOnEvent(-3, "Quit")
$ListView = GUICtrlCreateListView("Column1|Column2", 20, 20, 250, 130)
$ListViewItem = GUICtrlCreateListViewItem("Item|SubItem", $ListView)
GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")
GUISetState()
While 1
Sleep(10)
WEnd
Func DowbleClickEvent()
MsgBox(262144, "Clicked", GUICtrlRead(GUICtrlRead($ListView)))
EndFunc
Func WM_Notify_Events($GUI, $MsgID, $wParam, $lParam)
Local $tagNMHDR, $event, $hwndFrom, $code
$tagNMHDR = DllStructCreate("int;int;int", $lParam)
If @error Then Return
$code = DllStructGetData($tagNMHDR, 3)
If $wParam = $ListView And $code = $NM_DBLCLK Then DowbleClickEvent()
Return $GUI_RUNDEFMSG
EndFunc
Func Quit()
Exit
EndFunc
спасибо.
от таких добавлений мои функции разростаются как на .....сникерсах и чипсах =)))
хм, а свою dll тут ни как не создать? что просто вызывать когда необходимо?
proxy
а свою dll тут ни как не создать? что просто вызывать когда необходимо?
Для чего? что она должна делать? ... хотя это не ко мне, я в этих Dll пока блуждаюсь сильно.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.