Войти

Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [37] 38 39 40 41 42 43 44 45 46 47 48 49 50

amel27
14-11-2007, 06:22
Creat0R
как только скрипт завершает работу, окно свойств исчезает, не очень удобно... »думал ты это понял из предыдущего примера с сетевым подключением, поэтому не стал заострять внимание... :) имхо такое поведение вполне логично, так как при выходе все открытые объекты закрываются, так что в некоторых случаях это даже полезно. Кстати, таким образом можно включать/отключать сетевые подключения - Shell-альтернатива DevCon.

Kenwood3D
После запуска вылетает системное окно "Приложение или библиотека C:\WINDOWS\system32\irprops.cpl не является образом программы для Windows NT. Проверьте назначение установочного диска. " И выполнение зависает на строке "Sleep(1000)" »1. на Sleep() скрипт не зависает, а входит в цикл ожидания ("Esc" - для выхода)... так как окно свойств будет открыто только до тех пор пока работает скрипт, вместо цикла можно поставить команды обработки этого окна.
2. Ошибка никак не связана со скриптом, ищи в сетевых настройках Windows, начать можно отсюда:
Появление сообщения об ошибке «RUNDLL Ошибка загрузки irprops.cpl» при загрузке Windows XP (http://support.microsoft.com/kb/834340/ru)

Creat0R
14-11-2007, 08:57
amel27,
думал ты это понял из предыдущего примера с сетевым подключением
Я просто запустил пример, появилось окно свойств подключения, я нажал “Отмена” и затем убил скрипт - Познать сущность того примера, мне, на тот момент, не удалось :biggrin: .

такое поведение вполне логично, так как при выходе все открытые объекты закрываются, так что в некоторых случаях это даже полезно
100% согласен (с обеими утверждениями :) ), какое то чувство мне подсказывает, что именно такое поведение мне где нибудь пригодится..
Но пока, мне бы узнать о другом поведении, как это окно вызвать “на долго/навсегда” :) - может есть какой то API-метод? или возможно через CallBack функции как то?

Есть идея запускать отдельный скрипт, чтобы тот завершал работу только после закрытия диалога свойств, но это особо крайний вариант :(

P.S
А есть ещё вариант с созданием своего окна Свойства для файла, вроде встроенными функциями можно получить необходимую инфу, но всё же, оригинал, он есть оригинал ;)

amel27
14-11-2007, 12:43
Creat0R

Есть идея запускать отдельный скрипт, чтобы тот завершал работу только после закрытия диалога свойств »
есть ещё вариант с созданием своего окна Свойства для файла, вроде встроенными функциями можно получить необходимую инфу »
не вижу разницы между этими вариантами - оба требуют работы скрипта, только во втором случае еще и ГУИ рисовать :)

в принципе, можно сваять UDF на базе ShellExecuteEx (как тебе советовали на офсайте ;) ), но в плане запуска это ничего не даст - функция все равно требует наличия какого-либо целевого приложения, в данном случае это процесс самого скрипта... разве только добавится возможность делать новое окно дочерним к GUI

Kenwood3D
14-11-2007, 18:05
HotKeySet("{Esc}", "OnExit")
_OpenConnProperties('Подключение по локальной сети')
While 1
Sleep(1000)
Wend
Func _OpenConnProperties($sConnName)
Local $oShellApp = ObjCreate('shell.application')
Local $oCP = $oShellApp.Namespace (3), $item
For $item In $oCP.items
If $item.name = 'Сетевые подключения' Then
For $item In $item.getfolder.items
If $item.name = $sConnName Then $item.InvokeVerb('Сво&йства')
Next
EndIf
Next
EndFunc
Func OnExit()
Exit
EndFunc »
Так а куда указаывать имя сетевого подключения, свойства которого я хочу открыть? У меня их то несколько. Мож из-за этого и не хочет? На другом компе работает, но там только одно сетевое подключение.

Creat0R
14-11-2007, 23:09
amel27, не вижу разницы между этими вариантами - оба требуют работы скрипта
Ну в первом как бы остаётся иллюзия что скрипт завершил работу, а кокошко наместе :) - во-втором да, гуи рисовать нужно, но зато потом можно с этим окном делать что угодно (почти).

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


$GUI = GUICreate("My GUI")

GUISetState()
GUISetState(@SW_DISABLE)

_ShellExecuteEx(@DesktopDir & "\Test.txt", "", @DesktopDir, "properties", @SW_SHOW, $GUI)

Sleep(2000)

Func _ShellExecuteEx($sCmd, $Args="", $sFolder="", $Verb="", $rState=@SW_SHOWNORMAL, $hWnd=0)
If StringRight($sCmd, 3) = "lnk" Then
Local $iShortcutInfo = FileGetShortcut($sCmd)
If IsArray($iShortcutInfo) Then $sCmd = $iShortcutInfo[0]
EndIf

Local $aRet = DllCall("shell32.dll", "long", "ShellExecute", _
"hwnd", $hWnd, _
"string", $Verb, _
"string", $sCmd, _
"string", $Args, _
"string", $sFolder, _
"int", $rState)
If @error Then Return SetError(1, 0, 0)

Local $RetVal = $aRet[0]
If $RetVal > 32 Then Return SetError(0, 0, 1)
Return SetError(2, 0, 0)
EndFunc

Kenwood3D
куда указаывать имя сетевого подключения
В качестве единственного параметра функции _OpenConnProperties() ;)

Kenwood3D
15-11-2007, 01:26
В качестве единственного параметра функции _OpenConnProperties() »
Разобрался.
amel27, Creat0R, огромное СПАСИБО!

amel27
15-11-2007, 06:08
Creat0R в принципе догадываюсь что функция будет примерно такой, но и она у меня не работает »а чего ты для UDF _ShellExecuteEx() используешь API-функцию ShellExecute?.. она как раз не поддерживает "properties" ;)
HotKeySet("{Esc}", "OnExit")
_ShellExecuteEx(@ScriptName, "", @ScriptDir, "properties")

While 1
Sleep(500)
WEnd

Func _ShellExecuteEx($sCmd, $Args = "", $sFolder = "", $Verb = "", $rState = @SW_SHOWNORMAL, $hWnd = 0)
Local $struINFO = DllStructCreate("long;long;long;ptr;ptr;ptr;ptr;long;long;long;ptr;long;long;long;long")
Local $struVerb = DllStructCreate("char[15];char")
Local $struPath = DllStructCreate("char[255];char")
Local $struArgs = DllStructCreate("char[255];char")
Local $struWDir = DllStructCreate("char[255];char")
; Заполняем структуры параметров
DllStructSetData($struVerb, 1, $Verb)
If StringRight($sCmd, 3) = "lnk" Then
Local $aShortcutInfo = FileGetShortcut($sCmd)
If IsArray($aShortcutInfo) Then
DllStructSetData($struPath, 1, $aShortcutInfo[0])
DllStructSetData($struWDir, 1, $aShortcutInfo[1])
DllStructSetData($struArgs, 1, $aShortcutInfo[2])
$rState = $aShortcutInfo[6]
Else
Return 0
Endif
Else
DllStructSetData($struPath, 1, $sCmd)
DllStructSetData($struWDir, 1, $sFolder)
DllStructSetData($struArgs, 1, $Args)
EndIf
; Заполняем структуру SHELLEXECUTEINFO
DllStructSetData($struINFO, 1, DllStructGetSize($struINFO))
DllStructSetData($struINFO, 2, BitOR(0xC, 0x40, 0x400))
DllStructSetData($struINFO, 3, $hWnd)
DllStructSetData($struINFO, 4, DllStructGetPtr($struVerb))
DllStructSetData($struINFO, 5, DllStructGetPtr($struPath))
DllStructSetData($struINFO, 6, DllStructGetPtr($struArgs))
DllStructSetData($struINFO, 7, DllStructGetPtr($struWDir))
DllStructSetData($struINFO, 8, $rState)

Local $ret = DllCall("shell32.dll", "int", "ShellExecuteEx", "ptr", DllStructGetPtr($struINFO))
Return $ret[0]
EndFunc

Func OnExit()
Exit
EndFunc
P.S. кста я про ярлыки и не подумал :yes:

Creat0R
15-11-2007, 06:26
amel27,
а чего ты для UDF _ShellExecuteEx() используешь API-функцию ShellExecute?
Я пробовал ShellExecuteEx, но у меня почему то скрипт вываливался в тихом режиме (код выхода -1073741819).

я про ярлыки и не подумал
Я был удивлён когда узнал что родная ShellExecute не умеет запускать ярлыки :dont-know , поэтому с того момента и до сих пор, юзаю самопальную ShellExecute (именуемую как просто _Execute() :) ).

P.S
Спасибо за функцию, работает, правда параметр $hWnd пользы не приносиит, по крайней мере не визуально :( - т.е задаю hWnd родительского окна, а диалог свойств появляется как отдельное окно, без связи с родительским.

amel27
15-11-2007, 07:38
Creat0R
параметр $hWnd пользы не приносиит »угу, видимо он используется для других нужд... кста в MSDN сказано что-то типа - для месседж-боксов, которые могут возникнуть во время выполнения функции, что имелось ввиду неясно... :dont-know

Creat0R
15-11-2007, 23:38
amel27,
видимо он используется для других нужд
Ладно, всё ровно спасибо, API для меня предпочтительнее объектов/WMI и т.п.

[hr]

Самому как то давно (и кажется тут в ветке уже спрашивали про это), нужна была функция для получения текста с таба (SysTabControl321), поискал немного, не нашёл и разочаровался :( .
Но недавно кое кому тоже это понадобилось (http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=580#7), и я сразу вспомнил про библиотеку A3LLibrary - Но ради одной функции включать такую тяжёлую артиллерию, мне показалось излишним :unsure: ..

Собрав все нужные ресурсы с этой библиотеки, плюс немного с MSDN, плюс немного с головы (моей :) ), я написал рабочую функцию _ControlTab()!!! аж самому не верится, но всё прекрасно работает!

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

;===============================================================================
; Function Name: _ControlTab()
; Description: Sends a command to a SysTab32 Control.
; Syntax: _ControlTab ( $hWnd, $sText, $sCommand [, $sParam1 [, $sParam2 [, $sParam3]]] )
;
; Parameter(s): $hWnd = Window Handle/Title.
; $sText = Window Text.
; $sCommand = Command to send to the control (See "Return Value(s)").
; $sParam1, $sParam2, $sParam3 = Additional parameters required by some commands.
;
; Requirement(s): None.
;
; Return Value(s): Depends on command as shown below. In case of an error (such as an invalid command or window/control), @error=1
; If $sCommand Equel...
; "GetItemState" - State of the tab item returned.
; ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
;
; "GetItemText" - Text of the tab item returned.
; ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
;
; "GetItemImage" - Image Index of the tab item returned.
; ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
;
; "CurrentTab" - Returns the current Tab shown of a SysTabControl32.
;
; "TabRight" - Moves to the next tab to the right of a SysTabControl32.
;
; "TabLeft" - Moves to the next tab to the left of a SysTabControl32.
;
; "GetTabsCount" - Returns the number of total tab items of a SysTabControl32.
;
; "FindTab" - Search For tab item with specific text..
; In this case used all three additional parameters:
; $sParam1 - defines what text to find.
; $sParam2 - defines from what tab item the search will start (zero-based).
; $sParam3 - defines search type...
; If $sParam3 = True Then will be performed a partial search of the string in the tab item text.
;
; Author(s): G.Sandler a.k.a CreatoR
;
; Example(s):
; $TabText = _ControlTab("Properties", "", "GetItemText", 1) ;Will return the text of second tab from the left side.
;===============================================================================
Func _ControlTab($hWnd, $sText, $sCommand, $sParam1="", $sParam2="", $sParam3="")
Local Const $TCM_FIRST = 0x1300
Local $hTab = ControlGetHandle($hWnd, $sText, "SysTabControl321")

Switch $sCommand
Case "GetItemState", "GetItemText", "GetItemImage"
Local Const $TagTCITEM = "int Mask;int State;int StateMask;ptr Text;int TextMax;int Image;int Param"
Local Const $TCIF_ALLDATA = 0x0000001B
Local Const $TCM_GETITEM = $TCM_FIRST + 5

Local $tBuffer = DllStructCreate("char Text[4096]")
Local $pBuffer = DllStructGetPtr($tBuffer)
Local $tItem = DllStructCreate($tagTCITEM)
Local $pItem = DllStructGetPtr($tItem)

DllStructSetData($tItem, "Mask", $TCIF_ALLDATA)
DllStructSetData($tItem, "TextMax", 4096)
DllStructSetData($tItem, "Text", $pBuffer)

If $sParam1 = -1 Then $sParam1 = _ControlTab($hWnd, $sText, "CurrentTab")
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hTab, "int", $TCM_GETITEM, "int", $sParam1, "int", $pItem)

If @error Then Return SetError(1, 0, "")
If $sCommand = "GetItemState" Then Return DllStructGetData($tItem, "State")
If $sCommand = "GetItemText" Then Return DllStructGetData($tBuffer, "Text")
If $sCommand = "GetItemImage" Then Return DllStructGetData($tItem, "Image")
Case "CurrentTab", "TabRight", "TabLeft"
Local $iRet = ControlCommand($hWnd, $sText, "SysTabControl321", $sCommand, "")
If @error Then Return SetError(1, 0, -1)
Return $iRet - 1
Case "GetTabsCount"
Local Const $TCM_GETITEMCOUNT = $TCM_FIRST + 4
Local $iRet = DllCall("user32.dll", "long", "SendMessage", "hwnd", $hTab, "int", $TCM_GETITEMCOUNT, "int", 0, "int", 0)
If @error Then Return SetError(1, 0, -1)
Return $iRet[0]
Case "FindTab"
If Not IsNumber($sParam2) Or $sParam2 < 0 Then $sParam2 = 0
Local $sTabText

For $i = $sParam2 To _ControlTab($hWnd, $sText, "GetTabsCount")
$sTabText = _ControlTab($hWnd, $sText, "GetItemText", $i)
If $sParam3 = True And StringInStr($sTabText, $sParam1) Then Return $i
If $sTabText = $sParam1 Then Return $i
Next
Return -1
Case Else
Return SetError(1, 0, "")
EndSwitch
EndFunc

Вот пример:

$GUI = GUICreate("ControlTab Demo")

GUICtrlCreateTab(0, 20)
$Tab_1 = GUICtrlCreateTabItem("Tab 1")
$Tab_2 = GUICtrlCreateTabItem("Tab 2")
$Tab_3 = GUICtrlCreateTabItem("More Tab")

GUISetState()

For $i = 0 To _ControlTab($GUI, "", "GetTabsCount")-1
MsgBox(0, "", "Zero-Based tab number [" & $i & "]: " & @LF & _ControlTab($GUI, "", "GetItemText", $i))
_ControlTab($GUI, "", "TabRight")
Next

Creat0R
16-11-2007, 02:51
Как получить пути к системным папкам, не используя COM-обьекты? (Shell.Application к примеру, не на всех системах будет корректно работать).

Реестр тоже отпадает, там нет того что нужно (например “Мои видеозаписи” там и близко нет).

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

amel27
16-11-2007, 03:11
“Мои видеозаписи” там и близко нет »
неправда: HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders, параметр: "My Video"

Creat0R
16-11-2007, 03:35
amel27,
неправда: HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
Хм, поиск по “Мои видео” не дал результатов... спасибо.
Насколько “надёжна” эта ветка? она там присутствует на всех Win-системах?

amel27
16-11-2007, 04:03
Насколько “надёжна” эта ветка? »
ИМХО вполне надежна для тех ОСей, в которых такая папка определена в профиле - в Win2K к примеру ее не было... в XP она тоже не всегда присутствует, но в этом случае значение параметра "пусто"

Creat0R
16-11-2007, 04:19
amel27,
Ок, Спасибо.

V0van3
16-11-2007, 19:12
в хелпе к AUTOIT есть:

Таким образом, если сценарий запущен с помощью строки:
AutoIt3.exe myscript.au3 param1 "а это другой параметр"
то после загрузки в нем можно использовать следующий специальный массив:
$CmdLine[0] равно... 2
$CmdLine[1] равно... param1
$CmdLine[2] равно... а это другой параметр
@ScriptName равно... myscript.au3


так вот проблема в том что "а это другой параметр" в $CmdLine[2] обрезается до первого пробела!
вызывал из батнега:
%path_cmdutils%\Autoit3.exe %~dp0\FlashPlayerUpdate.au3 /p %AppPath%
как надо правильно если в значении %AppPath% есть пробелы?


от нефиг делать написал скрипт который проходит головоломку за меня методом тыка.
Может кто подаст идею какое условие в таком скрипте должно отследить успешное срабатывание чтобы сделать exitloop?

;Поочерёдный кликер в разные области экрана
;Copywrite by Vovan [CAD/EDP]

;Отображать текущую строку сценария с помощью индикатора системной панели в режиме отладки.
AutoItSetOption("TrayIconDebug", 1)

;запускать после открытия окна браузера
Run('C:\Program Files\Internet Explorer\iexplore.exe http://newyorkdesign.hp.infoseek.co.jp/findit.html')
;дожидаемся активности окна
WinWaitActive('findit - Microsoft Internet Explorer','')
;настройка мыши на коортдинатны окна
Opt("MouseCoordMode",2)

;координаты угла флешки
$absx=332
$absy=279

;ожидание загрузки страницы
Sleep(4000)
;кликнуть по "Start"
Sleep(500)
mouseclick("left",$absx+284,$absy+327,1)
;прокликать поочерёдно по пикселям
for $y=0 to 400 step 10
for $x=0 to 600 step 10
WinWaitActive('findit - Microsoft Internet Explorer','')
mouseclick("left",$absx+$x,$absy+$y,1)
Sleep(300)
;нажимаем кнопку "try again"
Send('{TAB}')
Send('{SPACE}')
next
next

Вообще что лучше использовать для управления веб интерфейсами autoit или autohotkey?

Creat0R
16-11-2007, 23:45
V0van3,
как надо правильно если в значении %AppPath% есть пробелы?
Заключить переменную в кавычки:

%path_cmdutils%\Autoit3.exe "%~dp0\FlashPlayerUpdate.au3" /p "%AppPath%"

какое условие в таком скрипте должно отследить успешное срабатывание чтобы сделать exitloop?
Срабатывание чего? из скрита непонятно какова цель..

А вообще, для таких задач (автоматизации Internet Explorer), есть встроенная библиотека IE.au3, там можно запустить адрес в IE, и функция будет ждать окончания загрузки страницы, также можно нажать на ссылку/кнопку зная заранее только её текст, и т.д и т.п.

то лучше использовать для управления веб интерфейсами autoit или autohotkey?
Думаю что они оба не подходят для этой задачи, хотя если только IE, тогда AutoIt для этого вооружён ;)

Creat0R
17-11-2007, 22:01
Ещё один сюрприз от разработчиков! :yahoo:

В последней бетте (http://www.autoitscript.com/forum/index.php?showtopic=19717&st=330&) добавили поддержку DllCallBack!!!

3.2.9.12 (17th November, 2007) (Beta)

- Added: DllCallbackRegister(), DllCallbackGetPtr() and DllCallbackFree()

Библиотека DllCallBack.au3 полагаю уже будет не нужна ;)

Creat0R
20-11-2007, 01:14
Имитация телефонного звонка:

HotKeySet("{Esc}", "Quit")

_PhoneRing(8)

;===============================================================================
;
; Function Name: _PhoneRing()
; Description: Beep Sound Imitation of Phone Rings.
; Parameter(s): $iRings [Optional] - Rings to beep (5 is the default),
; If $iRings > 0 Then this time of rings will be sounded.
; If $iRings < 0 Then number after - sign will be used to indicate how long (seconds) the function will ring.
; If $iRings = 0 Then the function will ring (loop) forever :)
; $iDuration [Optional] - Duration of the Ring to beep (15 is the default).
; $iWait - [Optional] How long to wait between each rings in milleseconds (1500 is the default).
;
; Return Value(s): Always returns 1 regardless of success.
; Requirement(s): None.
; Author(s): G.Sandler (a.k.a CreatoR).
;
;===============================================================================
Func _PhoneRing($iRings=5, $iDuration=15, $iWait=1500)
Local $iCount = 0, $iTimerInit = TimerInit()
While 1
$iCount += 1

For $i = 1 To $iDuration
Beep(1000, 35)
Beep(2000, 30)
Beep(1500, 25)
Next

If $iRings > 0 And $iCount = $iRings Then Return 1
If $iRings < 0 And TimerDiff($iTimerInit) / 1000 >= -$iRings Then Return 1

Sleep($iWait)
WEnd
EndFunc

Func Quit()
Exit
EndFunc

Creat0R
20-11-2007, 14:30
GuiCtrlSetOnHover() UDF!

Эта функция предназначена для управления элементами при наведении курсора мышки над ними (Hovering Process), используется точно также как и подобные функции GuiCtrlSetOnEvent().

Вот пример, создаёт алфавит из кнопок, когда проводим мышкой по кнопкам, они красятся в красный цвет, также обратите внимание - это будет работать даже если GUI окно не активно, и даже если запущен обычный MsgBox !!! (нажмите на кнопку буквы).

#include <GuiCtrlSetOnHover_UDF.au3>
Opt("GuiOnEventMode", 1)

$Btn_Color = 0x7A9DD8
$Hover_Color = 0xFF0000

$GUIMain = GuiCreate("GuiCtrlSetOnHover - Letters Demo", 570, 200)
GUISetOnEvent(-3, "Quit")

GUICtrlCreateLetters(10, 60, 18, 20)

$Close = GuiCtrlCreateButton("Close", 30, 120, 100, 30)
GUICtrlSetOnEvent($Close, "Quit")

GuiSetState()

While 1
Sleep(100)
WEnd

Func GUICtrlCreateLetters($iLeft, $Top, $Width=15, $Height=15)
Local $iLeft_Begin = $iLeft
Local $iAsc_Char = 64
For $i = 0 To 25
$iLeft_Begin += 20
$iAsc_Char += 1
GUICtrlCreateButton(Chr($iAsc_Char), $iLeft_Begin, $Top, $Width, $Height)
GUICtrlSetOnEvent(-1, "LetterEvents")
GUICtrlSetOnHover(-1, "Hover_Func", "Leave_Hover_Func")
GUICtrlSetBkColor(-1, $Btn_Color)
GUICtrlSetFont(-1, 6)
Next
EndFunc

Func LetterEvents()
MsgBox(64, "Pressed", "Letter = " & GUICtrlRead(@GUI_CtrlId))
EndFunc

Func Hover_Func($CtrlID)
GUICtrlSetBkColor($CtrlID, $Hover_Color)
EndFunc

Func Leave_Hover_Func($CtrlID)
GUICtrlSetBkColor($CtrlID, $Btn_Color)
EndFunc

Func Quit()
Exit
EndFunc

Сам UDF скачать можно тут (http://creator-lab.ucoz.ru/load/3-1-0-34).
История зарождения функции на оф. форуме (http://www.autoitscript.com/forum/index.php?s=&showtopic=55120&view=findpost&p=417780) ;) .




© OSzone.net 2001-2012