Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
Dim $var1 = '"' & @WindowsDir & '\'
Run(@ComSpec & " /c " & 'rundll32.exe Shell32.dll,Control_RunDLL desk.cpl desk,@Themes /Action:OpenTheme /File:' & $var1 & 'Resources\Themes\Blackbox.theme"', "", @SW_HIDE)
WinWait("Display Properties", "", 3)
$handle = WinGetHandle("Display Properties", "")
WinSetState($handle, "", @SW_HIDE)
;ControlClick("Display Properties", "", "[Class:Button; Instance:3]", "Left", 1)
Send("{ENTER}")
Exit
:\ =) не работает
semiono
WinSetState($handle, "", @SW_HIDE)
;ControlClick("Display Properties", "", "[Class:Button; Instance:3]", "Left", 1)
Send("{ENTER}") »
http://forum.oszone.net/showthread.php?p=694034&highlight=WinSetState+%40SW_HIDE#post694034
Я понял фитчу! Дело в том что не все окна наверное умеют скрыться... Вот с MINIMIZE пошло!
------
А, ага! прочёл, но наверное не то чтобы нельзя нажать, а видимо свойства окна не позволяют его вообще скрыть!?
Хотя, главное что я понял в чём трабла, ато уже забодало, нажимать и смотреть результат! :)
amel27, Я тут в придачу к твоим функциям _AU3_* написал ещё одну, _AU3_MergeAllLibs() - превращает исходный скрипт в один целый, со всеми инклюдами (указанными в нём) и константами. Для это мне пришлось немного изменить _AU3_GetAllLibUDF, чтобы возвращала ещё и полный путь к инклюду.
_AU3_MergeAllLibs(@ScriptDir & "\Test.au3", 0, 0, 1)
; ===============================================================
; _AU3_MergeAllLibs($sScriptFile, $iIncludeComments=0, $iRemoveIncludes=1)
; ---------------------------------------------------------------
; Смешивает вложенные библиотеки в тело скрипта
; (таким образом преобразовывая один цельный скрипт со всеим функциями и переменными)
; Использован AutoIT v3.2.12.1
;
; $sScriptFile : AutoIT-скрипт для смешивания
; $iIncludeComments : Определяет, нужно ли обрабатывать закомментированные строки
; $iIncludeEmptyLines : Определяет, нужно ли обрабатывать пустые строки
; $iRemoveIncludes : Определяет, нужно ли удалять строки #include'ов с исходного скрипта
;
; Автор : G.Sandler (a.k.a CreatoR)
; ===============================================================
Func _AU3_MergeAllLibs($sScriptFile, $iIncludeComments=0, $iIncludeEmptyLines=0, $iRemoveIncludes=1)
Local $aGetAllLibs, $aScript_Content, $sRead_SrcScript, $sHeader_Content, $hFOpen, $iIsFuncBody = 0
$sRead_SrcScript = FileRead($sScriptFile)
_AU3_GetAllLibUDF($sRead_SrcScript, $aGetAllLibs)
If $iRemoveIncludes Then $sRead_SrcScript = StringRegExpReplace($sRead_SrcScript, "(?i)(?s)#include.*?[\r\n]+", "")
For $i = $aGetAllLibs[0][0] To 1 Step -1
$iIsFuncBody = 0
$aScript_Content = StringSplit(StringStripCR(StringStripWS(FileRead($aGetAllLibs[$i][1]), 3)), @LF)
For $j = 1 To $aScript_Content[0]
If Not $iIncludeEmptyLines And $aScript_Content[$j] = "" Then ContinueLoop
If Not $iIncludeComments And StringLeft($aScript_Content[$j], 1) = ";" Then ContinueLoop
If StringLeft($aScript_Content[$j], 8) = "#include" Then
ContinueLoop ;We don't need the #includes, right?
ElseIf StringLeft($aScript_Content[$j], 4) = "Func" Then
$sRead_SrcScript &= @CRLF
$iIsFuncBody = 1
ElseIf StringLeft($aScript_Content[$j], 7) = "EndFunc" Then
$sRead_SrcScript &= $aScript_Content[$j] & @CRLF
$iIsFuncBody = 0
ContinueLoop
EndIf
If Not $iIsFuncBody Then ;Write to the Begining of file (Collecting the variables/constants Header)
$sHeader_Content &= $aScript_Content[$j] & @CRLF
Else ;Write to the End of file (UDF functions)
$sRead_SrcScript &= $aScript_Content[$j] & @CRLF
EndIf
Next
Next
If $sHeader_Content <> "" Then $sRead_SrcScript = $sHeader_Content & @CRLF & $sRead_SrcScript
$hFOpen = FileOpen($sScriptFile, 2)
FileWrite($hFOpen, $sRead_SrcScript)
FileClose($hFOpen)
EndFunc ; ==> _AU3_MergeAllLibs
; ===============================================================
; _AU3_GetAllLibUDF($sScript_Content, $aIncludes_Arr)
; ---------------------------------------------------------------
; Возвращает массив всех загруженных UDF и библиотечных файлов
; Использован AutoIT v3.2.12.0
;
; $sScript_Content : текст AutoIT-скрипта
; $aIncludes_Arr : ссылка на переменную для выходного массива,
; по выходу содержит двумерный массив:
; $aIncludes_Arr[0][0] - количество элементов в массиве
; $aIncludes_Arr[$i][0] - тип библиотечного файла
; $aIncludes_Arr[$i][1] - Полный путь библиотечного файла
; $aIncludes_Arr[$i][2] - Только имя библиотечного файла
; $aIncludes_Arr[$i][3] - массив UDF, определенных в файле
;
; Функция рекурсивная, поэтому выход по ошибке не предусмотрен
;
; Автор : amel27
; ===============================================================
Func _AU3_GetAllLibUDF($sScript_Content, ByRef $aIncludes_Arr)
Local Const $rFile = '(?i)(?:^|[\n\r])[ \t]*#include[ \t]+((?:\<|")[^\n\r\"\>]+(?:\>|"))'
Local Const $rUDFs = '(?i)(?:^|[\n\r])[ \t]*Func[ \t]+([\w\d]+)'
; Инициализация массива при первом входе / сохранение списка UDF
If UBound($aIncludes_Arr, 2) <> 4 Then Dim $aIncludes_Arr[2][4] = [[1, 0, 0], [0, "", 0]]
$aIncludes_Arr[$aIncludes_Arr[0][0]][3] = StringRegExp($sScript_Content, $rUDFs, 3)
; Инициализация переменных / Получение списка библиотечных файлов
Local $sPath, $iType, $sName, $sText
Local $aFile = StringRegExp($sScript_Content, $rFile, 3)
; Пофайловая обработка списка библиотек
If IsArray($aFile) Then
For $i = 0 To UBound($aFile)-1
$sPath = _AU3_LibIncToPath($aFile[$i]) ; полное имя файла
If @error Then ContinueLoop ; файл не найден
$iType = @extended ; тип библиотеки
$sName = StringRegExpReplace($sPath, "(?:[^\\]+\\)+", "") ; краткое имя файла
; Исключение повторной обработки / Чтение файла
For $j = 1 To $aIncludes_Arr[0][0]
If $aIncludes_Arr[$j][0] == $iType And $aIncludes_Arr[$j][2] == $sName Then ContinueLoop 2
Next
$sText = FileRead($sPath)
If @error Then ContinueLoop
; При успешном чтении добавляем файл в выходной массив
$aIncludes_Arr[0][0] += 1
ReDim $aIncludes_Arr[$aIncludes_Arr[0][0]+1][4]
$aIncludes_Arr[$aIncludes_Arr[0][0]][0] = $iType
$aIncludes_Arr[$aIncludes_Arr[0][0]][1] = $sPath
$aIncludes_Arr[$aIncludes_Arr[0][0]][2] = $sName
; Рекурсивный вызов на обработку текста библиотеки
_AU3_GetAllLibUDF($sText, $aIncludes_Arr)
Next
EndIf
EndFunc ; ==> _AU3_GetAllLibUDF
; ===============================================================
; _AU3_LibIncToPath($sInclude)
; ---------------------------------------------------------------
; Возвращает полный путь к библиотечному файлу по строке загрузки
; Использован AutoIT v3.2.12.0
;
; $sInclude : строка загрузки в формате #include, примеры:
; '<array.au3>'
; '"array.au3"'
; '"c:\Program Files\AutoIT3\Include\array.au3"'
;
; При успехе : возвращает полное имя файла, содержащее путь,
; макрос @extended указывает на тип библиотеки:
; 1 - системная библиотека (каталог установки)
; 2 - текущая библиотека (каталог скрипта)
; 3 - пользовательская библиотека (путь из реестра)
; 4 - путь к библиотеке явно указан при загрузке
;
; При неудаче : возвращает пустую строку и устанавливает @error:
; 1 - ошибка формата строки
; 2 - файл не найден
;
; Автор : amel27
; ===============================================================
Func _AU3_LibIncToPath($sInclude)
Local $aRegExp = StringRegExp($sInclude, '^(<|")([^>"]+)(?:>|")$', 3)
; Проверка на корректность формата строки
If Not IsArray($aRegExp) Then Return SetError(1, 0, "")
$sInclude = $aRegExp[1]
If StringInStr($sInclude, "\") = 0 Then
Local $sSYS, $sUDL, $aUDL, $sAU3 = @ScriptDir & "\" & $sInclude
; Определение каталога системных библиотек
$sSYS = StringRegExpReplace(@AutoItExe, "\\[^\\]+$", "")
$sSYS &= "\Include\"& $sInclude
; Чтение списка каталогов пользовательских библиотек
$sUDL = RegRead("HKCU\Software\AutoIt v3\AutoIt", "Include")
$aUDL = StringRegExp($sUDL, "([^;]+)(?:;|$)", 3)
; Проверка типов 1 и 2 (до пользовательских библиотек)
If $aRegExp[0] == '<' Then
If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
ElseIf $aRegExp[0] == '"' Then
If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
EndIf
; Проверка типа 3 (поиск среди пользовательских библиотек)
If IsArray($aUDL) Then
For $i = 0 To UBound($aUDL)-1
$aUDL[$i] &= "\" & $sInclude
If FileExists($aUDL[$i]) Then Return SetError(0, 3, $aUDL[$i])
Next
EndIf
; Проверка типов 1 и 2 (после пользовательских библиотек)
If $aRegExp[0] == '<' Then
If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
ElseIf $aRegExp[0] == '"' Then
If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
EndIf
Else
; Проверка типа 4 (файл с указанием полного пути)
If FileExists($sInclude) Then Return SetError(0, 4, $sInclude)
EndIf
; ОШИБКА: файл не найден
Return SetError(2, 0, "")
EndFunc ; ==> _AU3_LibIncToPath
Скрипт для тестирования - Test.au3:
#include <Array.au3>
$GUI = GUICreate("Test Script", 300, 200)
$Button = GUICtrlCreateButton("Button", 20, 40, 60, 20)
GUISetState(@SW_SHOW, $GUI)
While 1
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
WEnd
Если запустить в AutoIt 3.2.8.1, то можно убедиться, что изменение структуры #includ'ов в новых версиях было оправдано, в одной лишь Array сколько констант и UDF'ов.
Кто придумал эти си подобные языки! Или либо я в логике запутался, мне что <>1 что =1 трудно уловить так быстро. Но поидее после ControlCommand должна работать разумно, но оно вроде только выполняет либо чек, либо анчек при разных указаниях еррор и поидее вообще ничего не даёть. (нафиг нужно действие противоположное событию)
Если бы я "придумывал язык" я бы зделал - установить чекбокс (даже если он был установлен) и выполнять код дальше. Зачем усложняться то! :)
Столько функций и ни одной не могу выбрать, чтоб uncheck либо check безовсяких условий конкретно?
ControlCommand ("License", "", "[Class:Button; Instance:5]", "IsChecked" , "")
If @error = 1 Then
ControlClick("License", "", "[Class:Button; Instance:5]", "Left", 1, 5, 11)
EndIf
ControlClick("License", "", "[Class:Button; Instance:2]", "Left", 1, 37, 11)
Creat0R
Я тут в придачу к твоим функциям _AU3_* написал ещё одну, _AU3_MergeAllLibs() »
_AU3_GetAllLibUDF делает много лишнего, для одних инклюдов можно и упростить
превращает исходный скрипт в один целый, со всеми инклюдами (указанными в нём) и константами »кроме констант и UDF сейчас стало много инклудов с кодом инициализации (типа твоей GUICtrlSetOnHover), поэтому имхо есть смысл отпарсить константы регекспом перед перемещением в начало скрипта... И еще - имхо полностью убирать комменты не совсем политкорректно (у тебя это по умолчанию), как минимум нужно оставить ссылки на имя оригинального инклюда, откуда взят блок кода. :)
semiono
гм, забавно... сначала проверяется - стоит галка или нет на чекбоксе, и если при проверке возникла ошибка (например, чекбокса нет), то кликаем (?) левой кнопкой... а если проверка успешная (ура, такой чекбокс существует), то молча идем дальше - само состояние чекбокса тут вообще не проверяется, иначе было бы типа такого:$IsChecked = ControlCommand ("License", "", "[Class:Button; Instance:5]", "IsChecked" , "")
If $IsChecked = 1 Then ControlClick("License", "", "[Class:Button; Instance:5]", "Left", 1)
Maza Faka
14-11-2008, 08:47
я бы зделал - установить чекбокс (даже если он был установлен) »
Так и сделали :) Если тебе нужно просто отметить checkbox то необязательно проверять его состояние ;)
Maza Faka, где у меня ошибка?
amel27, _AU3_GetAllLibUDF делает много лишнего, для одних инклюдов можно и упростить »
Я знаю, просто не хотил портить оригинальное назначение функии. Тем более что подобный функционал нужен только на «личном уровне».
кроме констант и UDF сейчас стало много инклудов с кодом инициализации »
Имхо, оно не мешает, главное что оно будет подключено в той позиции в которой чередует сам инклюд.
полностью убирать комменты не совсем политкорректно (у тебя это по умолчанию), как минимум нужно оставить ссылки на имя оригинального инклюда, откуда взят блок кода »
Если кто-то смешивает подобным образом скрипт, то комменты ему наверняка не нужны :)
Но идея неплохая, нужно чтобы если коменты не пишутся, добавлять имена инклюдов...
semiono, Если бы я "придумывал язык" я бы зделал - установить чекбокс (даже если он был установлен) и выполнять код дальше. Зачем усложняться то! »
Так есть же это уже:
#include <GuiConstants.au3>
$GUI = GUICreate("Test Script", 300, 200)
$CheckBox = GUICtrlCreateCheckbox("CheckMe!", 20, 40)
GUICtrlSetState($CheckBox, $GUI_CHECKED) ;Тут мы сами отмечаем птичку (ради проверки)
GUISetState(@SW_SHOW, $GUI)
ControlCommand($GUI, "", $CheckBox, "Check") ;Тут птичка будет отмечена в любом случае ;)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Т.е в твоём случае будет так:
ControlCommand("License", "", "Button5", "Check")
Grammaton Cleric
14-11-2008, 09:16
И снова вопрос к спецам...
реально ли путь @ScriptFullPath получить в Dos кодировке? (дело в том, что его надо прописать в bat, а путь может содержать русские символы)
----------------
Мне нужно сделать так, чтобы после перезагрузки запустился скрипт. Там он будет "продолжать настройку" программы. Я, для этого, прописываю @ScriptFullPath в реестр, а точнее, в RunOnce. Я использую "компилированные" скрипты. Скрипт запускается, отрабатывает...., но существует проблема. Дело в том, что после запуска отрабатывает ТОЛЬКО скрипт, то есть все остальное, включая эксплорер, запускается только после того как отработает скрипт... Мне надо чтобы скрипт запустился в последнюю очередь. Я это пытаюсь сделать путем создания батника, в котором будет прописана команда запуска скрипта.
----------------
Может кто-то подкинет идею?
Grammaton Cleric
14-11-2008, 09:50
feax, Я так понимаю, что первое сообщение на этой странице - это попытка сдернуть кукисы у пользователей... Сам таким раньше занимался, так что судя по содержимому сообщения - его надо удалить... АДМИНЫ!!! МОДЕРЫ!!!
Grammaton Cleric
реально ли путь @ScriptFullPath получить в Dos кодировке? »
уже постил UDF: http://forum.oszone.net/post-797573-500.html
Я это пытаюсь сделать путем создания батника, в котором будет прописана команда запуска скрипта. »а почему бы скрипту не запустить второй раз самого себя через Run()?.. К примеру, если с параметром - просто запускает самого себя еще раз и завершает работу... Если нет - отрабатывает как обычно - ждет инициализации рабочего стола и т.п. примерно так: http://forum.oszone.net/post-889794-831.html
Maza Faka
14-11-2008, 10:12
где у меня ошибка? »
А я и не писал, что у тебя ошибка, всё правильно. Просто, когда я писал свой ответ, ты уже ответил :)
P.S.
Вот и Creat0R всё о том же :)
когда я писал свой ответ, ты уже ответил »a-a... :) меня эти три строчки ввели в ступор, тем более что ГУИ я редко использую :biggrin:
АДМИНЫ!!! МОДЕРЫ!!! »
спасибо, удалили :ok:
Grammaton Cleric
14-11-2008, 10:55
Про дос-кодировку СПАСИБО!!! Вот это весчь!
Про запуски Тоже интересная идея... Даже удивился, как все гениальное просто...
Всем спасибо, кто высказались, я боюсь меня не совсем правильно понимают...
Дело в том, что насчёт чек бокс, заведомо не известно он установлен [x] или может быть нет [ ]
Например, по дефолту прога ставиться со сброшенным чеком [ ] а скажем при многоразовом инсталле,
скажем инсталлер читает с реестра юзерские предпочтения, напр. [x] установлено.
Или в общем случае, все подводные камни не известны, что там инсталлер выкинет такого!
Обобщая сказанное, лучше усиленно ставить галку [x], ато ведь получается кликаем чтобы установить,
а там уже стоить либо с точностью до наоборот!
:)
Или
ControlCommand("License", "", "Button5", "Check") именно чекед всегда! Ща проверю... sorryY
--
Хм. taskmgr.exe - вообще невидимый! Au3Info его меню не показывает, а как быть? Есть ли способ Shutdown нажать?
У меня проблеммы с консольным shutdown.exe я подумал, может в GUI жать автоскриптом? :)
taskmgr.exe - вообще невидимый! Au3Info его меню не показывает, а как быть? Есть ли способ Shutdown нажать? »
Он может быть свёрнуты в трей, а в чём суть? просто выйтий из системы? AutoIt'овский ShutDown() не подходит? :)
Кстати на пункты меню можно ещё жать так (по CtrlID):
#include <WindowsConstants.au3>
#include <SendMessage.au3>
$hTskMgr = WinGetHandle("[CLASS:#32770;REGEXPTITLE:.*Windows.*]")
_SendMessage($hTskMgr, $WM_COMMAND, 2, 0)
У меня это вызывает пункт «Завершение диспетчера задач».
AutoIt'овский ShutDown() не подходит.
У меня EmuPMixDSP.exe процесс (звуковой движёк) вешает комп! Раньше shutdown -f -r -t 00 работало, но после того как я что-то удалил из служб nLite-ом, теперь только кнопкой пуск или диспетчером...
А AutoIt'овский ShutDown я проверял, аналогично консольному, тоже самое!
Я до сих пор причину ищу. Вроде бы нашёл уже, что это из-за отсутствия "Windows Firewall/Internet Connection Sharing (ICS)". Однако опять не работает, может потому-что эта в свою очередь COM+ юзает,
а его я тоже выкинул. Но более всего удивляет, каким образом taskmgr это делает? Вот бы из него команду выудить в консоль :)
amel27,
Не подскажешь снова по RegExp'ресам?
Нужно сформулировать Pattern для проверки содержимого б. обмена на присутствие путей к файлам (это скопированные файлы в проводнике). Но проверка должна быть максимально быстро, т.к проверка происходит при открытии контекстного меню, лишних задержек быть не должно.
Вот что я имею:
$Clip = _
"C:\Testing\SomeFile.txt" & @LF & _
"C:\Testing\OtherFile.txt"
;$Clip = ClipGet()
$sExt_Pattern = '\.txt|\.txt\.bk' ;Файлы ещё могут иметь расширение txt.bk (обязательно вместе)
$iEnable_Paste_Item = StringRegExp($Clip, '(?i)\A([a-z]+:\\|[a-z0-9]+:/|.*\\\\).*(' & $sExt_Pattern & ')(\n|$)')
MsgBox(0, "", "$iEnable_Paste_Item = " & $iEnable_Paste_Item)
Также хотелось бы немного улучшить проверку:
* Чтобы учитывались UNC пути более надёжно (я сам с ними никогда не работал, даже проверить негде).
* Чтобы учитывались расширения файлов на всех строках, т.е чтобы если хоть одна строка не подходит под Pattern, то возвращать нужно 0. Но это не самое важное, если оно будет замедлять проверку то не нужно, у меня в скрипте и так уже есть проверка на состояние скопированных файлов (копированы они, или вырезаны в проводнике).
И ещё задача по RegExp...
Нужно в результате получить это:
/In %s /Icon %s /Bin %s /Comp %s
Вот что пытаюсь:
$sCompile_String = '/In "Yes" /Icon "No" /Bin "Ok" /Comp 1'
For $i = 1 To 5
$sCompile_String = StringRegExpReplace($sCompile_String, '/(.*) ".*"', '/$1 %s')
Next
ConsoleWrite($sCompile_String & @CRLF)
Немогу понять, как сделать мультизамену без цикла, возможно ли оно? и как заменить любое значение (в кавычках или без) после «/.*»?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC