Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: gregaz
Дата сообщения: 12.04.2008 16:21
ViSiToR , Спасибо

Просьба посмотреть на Тестовом скрипте (правда и скорость обработки осталась такая же)
При попытке внести в ImageList иконку файла с расширениями :
$ext='exe' or $ext='htm' or $ext='html' or $ext='wjr' or $ext='js' и возможно еще какими -то
выдается системное Error : _GUIImageList_AddIcon : -1
и скрипт выгружается ?
Такое впечатление, что система ругается на то,что разным файлам присвоена одна иконка
или наоборот одинаковым файлам -разные ?


Код: #include <File.au3>
#include <Array.au3>
#include <GuiImageList.au3>

$gui= GuiCreate("Test",600, 500)
$hListView = _GUICtrlListView_Create ($gui, "",15,10,480,472,BitOR($LVS_REPORT,$LVS_SHOWSELALWAYS))
;Назначение иконок
$hImage = _GUIImageList_Create (16,16,5); 5-ФОН ОКНА
_GUIImageList_AddIcon ($hImage, "shell32.dll", 0)
_GUICtrlListView_SetImageList ($hListView, $hImage, 1)
; Создание колонок в ListView
_GUICtrlListView_InsertColumn ($hListView, 0, "Имя", 220)
_GUICtrlListView_InsertColumn ($hListView, 1, "Тип", 70)
$folder=@ProgramFilesDir&'\'&'Download Master'
;$folder=@ProgramFilesDir&'\'&'AutoIt3\Include'
$FileList=_FileListToArray($folder,"*",0)
$indImageList=0
For $i=1 To UBound($FileList)-1
$indImageList = $indImageList+1
_GUICtrlListView_AddItem ($hListView, $FileList[$i])
$arIcon=_FileGetIcon($folder&'\'&$FileList[$i])
MsgBox(0,'$FileList[$i] = '&$FileList[$i],$arIcon[1]&@CRLF& $arIcon[2])
_GUIImageList_AddIcon ($hImage, $arIcon[1], $arIcon[2])
_GUICtrlListView_SetItemImage ($hListView,$i-1, $indImageList)
Next
GUISetState ()
While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEnd

Func
_FileGetIcon($sFile)
Local $sRegDefault = "", $sDefIcon = "", $sExt, $hSearch, $sIconFile, $nIcon=0
Local $aRet[3], $iError = 0

If _IsFolder($sFile) Then
$sRegDefault = RegRead("HKCR\Folder", "")
If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
Else
$sExt = StringRegExpReplace($sFile, '^.*\.', '.')

If $sExt = ".lnk" Then
Local
$aLinkInfo = FileGetShortcut($sFile)

If Not @error Then
Dim
$aRet[3] = [2, _Expand_Environments($aLinkInfo[4]), $aLinkInfo[5]]
Return $aRet
EndIf
EndIf

If
$sExt = $sFile Then
$hSearch = FileFindFirstFile($sFile & ".*")
$sExt = StringRegExpReplace(FileFindNextFile($hSearch), '^.*\.', '.')
$sFile &= $sExt
FileClose($hSearch)
EndIf

$sRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $sExt, "ProgID")

If $sRegDefault = "" Then $sRegDefault = RegRead("HKCR\" & $sExt, "")
If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\" & $sRegDefault & "\DefaultIcon", "")
EndIf

If
$sDefIcon = "" Then
$sIconFile = "shell32.dll"
ElseIf $sDefIcon <> "%1" Then
If
StringRegExpReplace($sFile, "^.*\\", "") = "shell32.dll" Then
$sIconFile = $sFile
$nIcon
= 0
Else
Local
$aDefIconSplit = StringSplit($sDefIcon, ",")

If IsArray($aDefIconSplit) Then
$sIconFile = $aDefIconSplit[1]
If $aDefIconSplit[0] > 1 Then $nIcon = $aDefIconSplit[2]
Else
$iError = 1
EndIf
EndIf
ElseIf
$sDefIcon = "%1" Then
$sIconFile = $sFile
$nIcon
= 0
EndIf

Dim
$aRet[3] = [2, _Expand_Environments($sIconFile), $nIcon]

Return SetError($iError, 0, $aRet)
EndFunc

Func
_Expand_Environments($sString)
$sString = StringReplace($sString, "%windir%", @WindowsDir)
$sString = StringRegExpReplace($sString, "%HomeDrive%|%SystemDrive%", @HomeDrive)
$sString = StringReplace($sString, "%HomePath%", @HomePath)
$sString = StringReplace($sString, "%Temp%", @TempDir)
$sString = StringReplace($sString, "%ProgramFiles%", @ProgramFilesDir)
$sString = StringReplace($sString, "%UserProfile%", @UserProfileDir)
$sString = StringReplace($sString, "%AppData%", @AppDataDir)
$sString = StringReplace($sString, "%ComSpec%", @ComSpec)

Return $sString
EndFunc

Func
_IsFolder($name)
Return StringInStr(FileGetAttrib($name), "D")
EndFunc
Автор: usr721
Дата сообщения: 12.04.2008 20:36
- Нужно управлять звуком по горячим кнопкам (+- в процентах) с отображением osd о текущем состоянии
- Сворачивать программы в трей (например по нажаитю правой кнопкой по свернуть, или скроллом)
Может быть есть у кого готовые наработки
Автор: Leony8
Дата сообщения: 13.04.2008 20:12
Для этих целей я использую PowerPro, а не AutoIT.
Автор: ViSiToR
Дата сообщения: 14.04.2008 01:17
gregaz

Цитата:
При попытке внести в ImageList иконку файла с расширениями

У меня всё нормально с этим примером, никаких ошибок. Если раскомментировать строчку со вторым $folder (убрав include), тогда выдаётся ошибка.. причина в том, что для файла Au3Check.exe нет иконки, тут то и определяется ошибка. Опять же, для меня очень всё это странно, UDF'ы не должны так себя вести.

А почему именно _GUIImageList_AddIcon нужно использовать? можно ведь встроенными средствами...


Код: #include <GuiConstants.au3>
#include <File.au3>

$Gui = GUICreate("Test", 600, 500)

$hListView = GUICtrlCreateListView("Имя|Тип", 15, 10, 480, 472, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))

$Folder = @ProgramFilesDir & '\AutoIt3'
$aFileList =_FileListToArray($Folder, "*", 0)

For $i = 1 To UBound($aFileList)-1
$aIcon = _FileGetIcon($Folder & '\' & $aFileList[$i])

;Проверка на наличие иконки, если нет ни одной, присваиваем системную (ну или для exe'шника отдельно)
$aIcons = DllCall("Shell32.dll", "int", "ExtractIconEx", "str", $aIcon[1], _
"int", -1, "ptr", 0, "ptr", 0, "int", 0)

If $aIcons[0] < 1 Then
$aIcon[1] = "shell32.dll"
If StringRegExpReplace($aFileList[$i], "^.*\.", "") = "exe" Then $aIcon[2] = 2
EndIf

GUICtrlCreateListViewItem($aFileList[$i], $hListView)
GUICtrlSetImage(-1, $aIcon[1], -$aIcon[2]-1)
Next

GUISetState()

While 1
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
WEnd
Автор: gregaz
Дата сообщения: 14.04.2008 06:58
ViSiToR

Цитата:
А почему именно _GUIImageList_AddIcon нужно использовать? можно ведь встроенными средствами...

При использовании встроенных средств и GUICtrlSetImage вообще проблем не возникает, но мне уже надоело прыгать с встроенных ф-ий на UDF и обратно (то там,то здесь в дальнейшем натыкаюсь на возникаюшие проблемы несовместимости
Остановился на UDF

Цитата:
В принципе, для решения проблемы с использованием UDF'ов, можно просто закомментировать строчку:

По-моему она у меня закомментирована :

Код:
Func _WinAPI_Check($sFunction, $fError, $vError, $fTranslate = False)
    If $fError Then
        If $fTranslate Then $vError = _WinAPI_GetLastErrorMessage()
        _WinAPI_ShowError($sFunction & ": " & $vError)
    EndIf
EndFunc ;==>_WinAPI_Check
Автор: Maza Faka
Дата сообщения: 14.04.2008 07:17
usr721

Цитата:
- Нужно управлять звуком по горячим кнопкам (+- в процентах) с отображением osd о текущем состоянии

Пробуй:

Код: HotKeySet("^=", "_VolIncrease")
HotKeySet("^-", "_VolDecrease")
HotKeySet("{Pause}", "_Exit")

Global $VolPercent = 0

SoundSetWaveVolume($VolPercent)

ToolTip("Volume = 0%", 0, 0)

While 1
Sleep(100)
WEnd

Func
_VolIncrease()
If $VolPercent = 100 Then Return False
$VolPercent += 10
SoundSetWaveVolume($VolPercent)
ToolTip("")
ToolTip("Volume = " & $VolPercent & "%", 0, 0)
EndFunc

Func
_VolDecrease()
If $VolPercent = 0 Then Return False
$VolPercent -= 10
SoundSetWaveVolume($VolPercent)
ToolTip("")
ToolTip("Volume = " & $VolPercent & "%", 0, 0)
EndFunc

Func
_Exit()
ToolTip("")
Exit
EndFunc
Автор: ViSiToR
Дата сообщения: 14.04.2008 17:16
gregaz

Цитата:
По-моему она у меня закомментирована

Нет, нужно так:


Код: Func _WinAPI_Check($sFunction, $fError, $vError, $fTranslate = False)
If $fError Then
If $fTranslate Then $vError = _WinAPI_GetLastErrorMessage()
;_WinAPI_ShowError($sFunction & ": " & $vError)
EndIf
EndFunc ;==>_WinAPI_Check
Автор: ynbIpb
Дата сообщения: 14.04.2008 20:39
Уважаемые, есть пара вопосов.

1. Мой скрипт запускает игру (lineage2). Бывает что запущено несколько окон этой игры как в полноэкранном виде так и в оконном. как мне идентифицировать какждое окно и не спутаться в них? сейчас определяю его только по заголовку
WinWaitActive("Lineage II","",60); ожидаем окна игры

2. Есть у меня в скрипте такое место, где читается вся секция из ини файла и если там нет ни одно ключа, то @error должно возвратить 1, но как написано в хелпе значение сохраняется до момента вызова следующей функции. А мне нужно о нём вспомнить немного дальше на другом участке кода я сделал так,сразу после команды чтения секции вставил:
$error = @error
Правильно ли это? или есть более грамотный способ?

3. Заполняю я Combo (выпадающий список) ключами из секции *.ini файла.
Ключей может быть сколько угодно и нужно их все внести в комбо. Сделал так:

Код: For $i = 1 To $inisection[0][0]
GUICtrlSetData($Combo1, $inisection[$i][1],$first);заполняем выпадающий список
Next
Автор: usr721
Дата сообщения: 14.04.2008 23:33
Maza Faka Спасибо! По первому варианту, хорошо работает. По второму - имелось ввиду сворачивать в трей уже запущенные приложения со своими иконками.

И еще, я наверно после nncron не правильно понял принцип работы autoit, думал ему можно накидать заданий на определенное время + хуки на калвиши и обрабатывать все это будет один контроллер, а вроде получается что на каждый скрипт запускается свой экземпляр приложения, в общем есть ли возможность использовать программу как удобный планировщик или это чисто мощный исполнитель скриптов и придется искать другую замену крону (вынужден отказаться от него)? (нужно чтоб одна программа и планировищик, и напоминалка (желательно в 2 клика добавить напоминание), и хоткей менеджер)
Автор: ViSiToR
Дата сообщения: 15.04.2008 01:48
ynbIpb

Цитата:
как мне идентифицировать какждое окно и не спутаться в них?

Если есть текст у этого окна, то это один метод, также можно использовать классы окна, но полагаю для окон с одним заголовком, будут и классы одни и теже. Можно также проходиться по массиву всех окон ($aWinList = WinList("Lineage II"), и использовать идентификаторы окон ($aWinList[$i][1]).


Цитата:
Правильно ли это?

Да, именно так и сохраняется уровень ошибочности после выполнения функции.


Цитата:
Может есть грамотнее решение?

В этом случае (только лишь в целях ускорения), можно собрать все данные в переменную через разделитель данных ( | ), далее один раз заполнить Combo..


Код: $sCombo_Content = ""

For $i = 1 To $inisection[0][0]
$sCombo_Content &= $inisection[$i][1] & "|"
Next

$sCombo_Content = StringRegExpReplace($sCombo_Content, "\A\|+|\|+$", "") ;удаляем все разделители в начале, и на конце

GUICtrlSetData($Combo1, $sCombo_Content, $first) ;заполняем выпадающий список
Автор: usr721
Дата сообщения: 15.04.2008 02:53

Цитата:
Есть, я уже раньше писал; AutoIt может почти(?) всё что может nncorn, и намного больше.
я понимаю что может многое, хелп пролистал, примеры глянул, но как это все организовать в планировщик, может быть продолжите мысль, в идеале нужно иметь список активных скриптов/правил с возможностью сортировать их по категориям, выполнением просроченных задач, в общем гибкое управление задачами, и чтобы все это обрабатывал один экземпляр программы не в порядке очереди (одно правило завершилось, пошло второе)

Автор: ViSiToR
Дата сообщения: 15.04.2008 03:08
usr721

Цитата:
хелп пролистал, примеры глянул

Этого будет мало для построения подобной программы
Нужен опыт, знания, время... последнего, у меня лично явно нехватает

Пробуй для начала написать одно задание, чтобы скрипт его выполнял в указанное время, если есть конкретные трудности, пиши, возможно поможем, но не думаю что кто-то возьмётся написать всё с нуля.
Автор: gregaz
Дата сообщения: 15.04.2008 07:49
ViSiToR

Цитата:
Я в своём предыдущем сообщении привёл пример, ты его пробовал запускать на проблемные папки?


После того как ты показал изменение в ф-ии : _WinAPI_Check
все проблемные папки читаются и пишутся иконки в LV .

Если я правильно понял теперь системное сообщение об ошибке не выдается ,
ошибка выявляется на уровне AutoIT и ставится иконка от "shell32.dll"

Огромное спасибо-это именно то,что я хотел (ошибка отлавливается)
Автор: ynbIpb
Дата сообщения: 15.04.2008 08:47
ViSiToR
Спасибо! решение с комбо то, что я искал.
Окно решил идентифицировать по классу (чтоб не спутать например с открытой папкой с таким именем) и хендлу (чтоб различать меж собой их.)
типа: WinWaitActive("[TITLE:Lineage II; CLASS:l2UnrealWWindowsViewportWindow]", "",60)
а потом сразу команду WinGetHandle
Или ещё приспособить параметр INSTANCE - отсчитываемый от нуля экземпляр окна из множества сопоставимых (приемлемых). Не понятно от чего он отсчитывает? типа время создания окна? или процесса?

Возникли ещё проблемы.
В моём скрипте я задал сочетание клавиш, при котором вызывается моя функция.
HotKeySet("^l", "_login") типа Ctrl + L.
Вызываемая функция посылает активному окну (Lineage II) нажатия клавиш Send($login).
Так вот если я нажимаю комбинация через правый контрол то вводится в окно текст без первого символа. типа посылаю я login а приходит ogin. Если левый контрол то всё нормально. После завершения работы скрипта и закрытия окна с которым работал скрипт остаётся залипшей клавиша контрол. как это исправить?
Автор: Maza Faka
Дата сообщения: 15.04.2008 09:21
ynbIpb

Цитата:
остаётся залипшей клавиша контрол

Попробуй с помощью ControlSend()
Автор: ynbIpb
Дата сообщения: 15.04.2008 09:36
Дело в том, что у окна Lineage2 нет управляющих элементов и поэтому я посылаю непосредственно самому окну. Или в этой команде пункт controlID можно оставить пустым?
Но залипшая клавиша всётаки из-за HotKeySet мне кажется.

--------------
edited:

Ура! я спасён! Огромное спасибо Мазафака. обе проблемы сразу пропали. Окно принимает эти команды и клавиши не залипают.
Автор: usr721
Дата сообщения: 15.04.2008 09:56

Цитата:
но не думаю что кто-то возьмётся написать всё с нуля.
меня не так поняли, получается нужно писать программу (мощный скрипт) на autoit, которая по сути будет планировщиком/менеджером выполенния скриптов (которая сама будет следить за очередью и циклом выполнения задач), такое не нужно, это изврат, буду искать сторонний планировщик и вызывать с него при необходимости скрипты autoit
Автор: jupiter1976
Дата сообщения: 16.04.2008 11:05
Уважаемые Гуру!!!

Подскажите где взять или помогите написать функцию, которая бы в файле (например .txt ) удалял строку если найдена подстрока, при этом функция должна возвращать номер удаленной строки и умела либо удалять со смещением, либо со вставкой пустой строки на место удаленной, в зависимости от параметра.
Автор: sklyaroff
Дата сообщения: 16.04.2008 12:33
Доброго времени суток!
Такой вопрос: можно ли в AutoIt получить выделенный текст, т.е. пользователь выделяет какую-нибудь фразу, слово в любом окне, нужно получить этот текст... Пока приходит в голову только посылать Ctrl+C и вытаскивать потом из буфера обмена, что не есть хорошо...
Или подскажите хотя бы форум, ресурс, где можно получить ответы по применению AutoIt?
Автор: usr721
Дата сообщения: 16.04.2008 12:50

Цитата:
Пока приходит в голову только посылать Ctrl+C и вытаскивать потом из буфера обмена, что не есть хорошо...
зато очень универсально
вот форум допустим http://www.autoitscript.com/autoit3/resources.shtml#Forum

Еще в шапке есть Скрипт для конвертирования выделенного текста, наверняка там как-то выделенные текст получается
Автор: Loopback
Дата сообщения: 16.04.2008 13:54

Цитата:
Подскажите где взять или помогите написать функцию, которая бы в файле (например .txt ) удалял строку если найдена подстрока, при этом функция должна возвращать номер удаленной строки и умела либо удалять со смещением, либо со вставкой пустой строки на место удаленной, в зависимости от параметра.


На мой взгляд, довольно значительным недостатком Autoit является факт, что он может открыть файл либо только для чтения, либо только для записи. Таким образом, средствами Autoit сразу удалить строку нельзя, придется переписывать в новый файл, либо читать файл в память. Оба варианта ниже.


Код: #include <File.au3>

$sFilePath = "Путь к файлу"
$sSubstring = "Строка для поиска"
$bShift = False ; Если True - убирать строку, иначе - делать пустой.

Dim $aArray
_FileReadToArray($sFilePath, $aArray)

$hFile = FileOpen($sFilePath, 2)
For $i = 1 To $aArray[0]
If StringInStr($aArray[$i], $sSubstring) Then
If
$bShift Then ContinueLoop
FileWriteLine($hFile, "")
Else
FileWriteLine($hFile, $aArray[$i])
EndIf
Next

FileClose($hFile)
Автор: SysLam
Дата сообщения: 16.04.2008 16:50

Цитата:
удалял строку если найдена подстрока, при этом функция должна возвращать номер удаленной строки и умела либо удалять со смещением, либо со вставкой пустой строки на место удаленной, в зависимости от параметра
до кучи:


Код: Func _FileFindLineReplace ($sFile, $sFind, $sReplace = "")
Local $sText = FileRead($sFile)
If @error Then Return SetError(1, @error,-1)

Local $iLine = 0, $iFind = StringInStr($sText, $sFind)
If $iFind=0 Then Return 0
Local $sLeft = StringLeft($sText, $iFind-1)
$sFind = StringRegExpReplace($sFind, "([][)(}{^$.*+?|\\])", "\\\1")
$sText = StringRegExpReplace($sText, "(?m)^.*?"& $sFind &"[^\n]*?(?:\n|\z)", $sReplace, 1)

Local $hFile = FileOpen ($sFile, 2)
If $hFile=-1 Then Return SetError(2, @error,-1)
FileWrite($hFile, $sText)

$sLeft = StringRegExpReplace($sLeft, "\n", "")
Return @extended+1
EndFunc
Автор: Mister_Che
Дата сообщения: 20.04.2008 19:03
А можно так сделать, чтобы мышь переместилась куда надо, тыкнула там, потом набрался текст, потом опять переместилась, тыкнула и набрался текст, потом опять переместилась, тыкнула, потом переместилась, нажалась, переместилась, отпустилась и это бы повторилось через минуту?
Автор: ViSiToR
Дата сообщения: 20.04.2008 20:22
Mister_Che 20:03 20-04-2008
Цитата:
можно так сделать, чтобы мышь переместилась куда надо, тыкнула там, потом набрался текст...

Можно.
Автор: Mister_Che
Дата сообщения: 20.04.2008 20:24
ViSiToR

Цитата:

Можно.

Как?
Автор: ynbIpb
Дата сообщения: 20.04.2008 20:31
Mister_Che качай русских хелп к программе и там всё доступно описано про работы с мышью и текстом. Эти команды изучи подробно:
MouseMove( x, y [,speed] )
MouseClick( "button" [[[,x ,y] ,clicks],speed] )
Send ( "keys", [flag] )
MouseClickDrag( "button" ,x1,y1,x2,y2 [,speed] )
Автор: Mister_Che
Дата сообщения: 20.04.2008 20:39
А какова ссылка на русский хелп? Имеется в виду Русский справочник по API-функциям?
Автор: ViSiToR
Дата сообщения: 20.04.2008 22:06
Mister_Che

Цитата:
какова ссылка на русский хелп?


В шапке есть всё необходимое


Цитата:
Справку на русском (и не только) вы всегда(?) сможете найти тут

Автор: ViSiToR
Дата сообщения: 21.04.2008 00:45
Mister_Che

Цитата:
подскажите первые шаги



Код: ;См. комментарии в самой функции
ClickAndSend(200, 500, 1, 0, "Hello World!")

;Ждём минуту
Sleep(1000 * 60)

;Делаем тоже самое с другими координатами
ClickAndSend(400, 300, 1, 0, "Goodby World!")

;Функция для движения мышки и посылания текста
Func ClickAndSend($iX_Click, $iY_Click, $iClicks=1, $iClickSpeed=0, $sTextToSend="")
;Это нажимает главную кнопку мышки по заданным координатам (200 с лева и 500 с верху).
;Где 1, это сколько раз кликнуть, где 0, это скорость движения мышки, 0 самая быстрая, 100 самая медленная.

MouseClick("Main", $iX_Click, $iY_Click, $iClicks, $iClickSpeed)

;Посылаем "Hello World!", чтобы символ ! не читался как служебный, ставим последний параметр в 1
;(читаем справку для подробностей).

Send($sTextToSend, 1)
EndFunc
Автор: Mister_Che
Дата сообщения: 21.04.2008 00:48
Cейчас творю, работа кипит, все же nnCronos по крайней мере для Висты проигрывает этой программе.

Добавлено:
ViSiToR, спасибо! У меня даже у самого чего-то получается. Гениальная программа.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.