Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
Maza Faka
06-12-2007, 06:53
Creat0R
коро выложу «AutoIt Bar»
Ждёмс... :)
Maza Faka
06-12-2007, 10:11
В новой версии кол-во UDF увеличилось, что не может не радовать, но увеличилось также кол-во вопросов. :-)
Взять к примеру Можно ли выполнять редактирование по месту в текстах элементов ListView ?, я и не думал, что это сложная задача, пока сам не столкнулся с ней. Пример из справки (немного отредактированный):
#include <GuiConstants.au3>
#include <GuiListView.au3>
$Gui = GUICreate("Test", 300, 200)
$hListView = _GUICtrlListView_Create($GUI, "Items|SubItems", 2, 2, 296, 196, BitOR($LVS_EDITLABELS, $LVS_REPORT))
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
$ListItem1 = _GUICtrlListView_AddItem($hListView, "Item1")
$ListItem2 = _GUICtrlListView_AddItem($hListView, "Item2")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hListView
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $LVN_BEGINLABELEDIT
Local $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
Return False
Case $LVN_ENDLABELEDIT
Local $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
Local $tBuffer = DllStructCreate("char Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
If StringLen(DllStructGetData($tBuffer, "Text")) Then Return True
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Я смутно понимал, что для этой задачи нужно применить GuiRegisterMsg(), но не думал, что это будет довольно таки сложная конструкция, для казалось простой задачи. Вот если бы кто-нибудь разжевал её (Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)), было- бы вообще здорово. В идеале хотелось бы научиться решать подобные задачи самостоятельно, без справки, но к сожалению уровень моих знаний далёк от этого :-(.
Maza Faka
По поводу Toolbar'а...
Вот простенький пример (примитивного уровня)...
http://img228.imageshack.us/img228/6959/splitterbardx0.png
#include <GuiConstants.au3>
$Gui = GuiCreate("Splitter Bar", 200, 70)
$Menu = GUICtrlCreateMenu("Menu")
GUICtrlCreateMenuItem("Item", $Menu)
GuiCtrlCreateSeperator(0, 3, 5, 3, 195)
$Left = 7
$IconsArr = StringSplit("13|23|25|169|28", "|")
For $i = 1 To $IconsArr[0]
$ControlID = GUICtrlCreateButton("", $Left, 10, 24, 24, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", $IconsArr[$i], 0)
If $i < $IconsArr[0] Then GuiCtrlCreateSeperator(1, $Left + 30, 10)
$Left += 40
Next
GuiCtrlCreateSeperator(0, 3, 40, 3, 195)
GUISetState()
While 1
$Msg = GUIGetMsg()
Switch $Msg
Case -3, $ControlID
Exit
EndSwitch
WEnd
Func GuiCtrlCreateSeperator($Direction, $Left, $Top, $Width=3, $Lenght=25)
Switch $Direction
Case 0
GUICtrlCreateLabel("", $Left, $Top, $Lenght, $Width, $SS_SUNKEN)
Case 1
GUICtrlCreateLabel("", $Left, $Top, $Width, $Lenght, $SS_SUNKEN)
EndSwitch
EndFunc
Только ссегодня узнал (http://www.autoitscript.com/forum/index.php?s=&showtopic=58806&view=findpost&p=444133), что обычный Label может использоваться как разделитель в тулбаре :)
Maza Faka
07-12-2007, 06:33
Creat0R
Только ссегодня узнал, что обычный Label может использоваться как разделитель в тулбаре
Класс! :kruto: Мне нравится :)
Kenwood3D
07-12-2007, 17:10
Подскажите, пожалуйста, как можно переключатся по закладкам и выбрать нужный компонент в подобном окне (свойство "Подключение по локальной сети") без использования имитации нажатия клавиш и мыши. Дело в том что число компонентов и закладок может изменятся, поэтому иметация нажатия уже будет не попадать.
HORRIBLE
07-12-2007, 21:06
А как написать, что бы можно было копировать папки/фалы с сдрома, незная буквы CD? можно ли такое сделать на AUTO IT.
Спасибо.
видимо моя проблема так и не решится ( »
Частично :
Вот автовход на сайт : www.nn.ru
#include <IE.au3>
$oIE = _IECreate ("http://www.nn.ru/popup.php?c=classUsers&m=forum&s=&users_do=enter")
$oForm = _IEFormGetCollection ($oIE, 0);
MsgBox(0,"",$oForm,1)
$oQuery0 = _IEFormElementGetCollection ($oForm, 0)
_IEFormElementSetValue ($oQuery0, "Login")
$oQuery1 = _IEFormElementGetCollection ($oForm, 1)
_IEFormElementSetValue ($oQuery1, "E-Mail")
$oQuery2 = _IEFormElementGetCollection ($oForm, 2)
_IEFormElementSetValue ($oQuery2, "123456")
_IEFormSubmit ($oForm)
Kenwood3D,
Для переключения вкладок, можно использовать мою UDF _ControlTab() (http://forum.oszone.net/thread-60616-174.html#post679587), и указывать текст в качестве идентификатора...
Т.к я изменил функцию, вылажу её ещё раз чуть ниже (не помещается) - добавлена возможность выбора определённого таба ("TabSelect"), и для TabRight/TabLeft теперь можно указывать дополнительный пареметр, определяющий сколько сдвигов следует сделать вправо/влево:
$ConnPropTitle = 'Подключение по локальной сети'
$TabText = "Проверка"
_OpenConnProperties($ConnPropTitle)
WinWait($ConnPropTitle)
$iIndex = _ControlTab($ConnPropTitle, "", "FindTab", $TabText, "", True)
_ControlTab($ConnPropTitle, "", "TabSelect", $iIndex)
Sleep(2500)
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
HORRIBLE
что бы можно было копировать папки/фалы с сдрома, незная буквы CD?
Перебором CDRom'ов...
$DrivesArr = DriveGetDrive("CDROM")
MsgBox(0, "", "Всего CD-ROM'ов: " & UBound($DrivesArr)-1)
For $i = 1 To UBound($DrivesArr)-1
MsgBox(0, "", _
"CD-ROM №" & $i & ":" & @LF & _
"Буква диска: " & StringUpper($DrivesArr[$i]) & "\" & @LF & _
"Состояние диска: " & DriveStatus($DrivesArr[$i]))
Next
Функция _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 an invalid command or window/control, @error set to 1 and return ""
; If $sCommand Equel...
; "GetItemState" - State of the tab item returned.
; ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
; On failure return "" and set @error to 1.
;
; "GetItemText" - Text of the tab item returned.
; ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
; On failure return "" and set @error to 1.
;
; "GetItemImage" - Image Index of the tab item returned.
; ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
; On failure return "" and set @error to 1.
;
; "CurrentTab" - Returns the current Tab shown of a SysTabControl32.
; On failure return -1 and set @error to 1.
;
; "TabRight" - Moves to the next tab to the right of a SysTabControl32.
; ($sParam1 defines how many times move to the right tab - 1 is the default).
; On failure return -1 and set @error to 1.
;
; "TabLeft" - Moves to the next tab to the left of a SysTabControl32.
; ($sParam1 defines how many times move to the left tab - 1 is the default).
; On failure return -1 and set @error to 1.
;
; "TabSelect" - Select specific tab item (base on given zero-based index) of a SysTabControl32.
; On failure return -1 and set @error to 1.
;
; "GetTabsCount" - Returns the number of total tab items of a SysTabControl32.
; On failure return -1 and set @error to 1.
;
; "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.
; On seccess: return the tab item index taht contain founded text.
; On failure:
; If $sParam2 >= total tabs count, return -1 and set @error to 1.
; If could not find tab, return -1.
;
; 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 Or $sParam1 = "" Then
$sParam1 = _ControlTab($hWnd, $sText, "CurrentTab")
If @error Then Return SetError(1, 0, "")
EndIf
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"
Local $iRet = ControlCommand($hWnd, $sText, "SysTabControl321", $sCommand, "")
If @error Then Return SetError(1, 0, -1)
Return $iRet - 1
Case "TabRight", "TabLeft"
Local $iRet = 0
If Not IsNumber($sParam1) Or $sParam1 <= 0 Then $sParam1 = 1
For $i = 1 To $sParam1
$iRet = ControlCommand($hWnd, $sText, "SysTabControl321", $sCommand, "")
If @error Then Return SetError(1, 0, -1)
Next
Return $iRet
Case "TabSelect"
Local Const $TCM_SETCURFOCUS = $TCM_FIRST + 48
Local $iRet = DllCall("user32.dll", "long", "SendMessage", _
"hwnd", $hTab, "int", $TCM_SETCURFOCUS, "int", $sParam1, "int", 0)
If @error Then Return SetError(1, 0, -1)
Return $iRet[0]
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
Local $iCnt = _ControlTab($hWnd, $sText, "GetTabsCount")
If $sParam2 >= $iCnt Then Return SetError(1, 0, -1)
For $i = $sParam2 To $iCnt
$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 ;==> _ControlTab
amel27,
Мы мучались с DllCallBack (чтобы скрипт не останавливался на момент перемещения окна), когда можно было просто использовать обычный GUIRegisterMsg($WM_TIMER, "WM_TIMER") http://files.myopera.com/Creat0R/Opera_AC/Icons/Kolobki/crazy.gif - По сути тот же CallBack, но намного проще.
Инфу чисто случайно откопал из скрипта “Network profiles” (на оф. форуме) ...
#include <GuiConstants.au3>
Global Const $WM_TIMER = 0x0113
$Gui = GuiCreate("_TimerFunc Test", 300, 130)
$Left = -200
$Label = GUICtrlCreateLabel("Drag the window, i am just a runing text ;)", $Left, 100)
$RunCheckBox = GUICtrlCreateCheckbox("Run text", 20, 40)
GUISetState()
While 1
$Msg = GUIGetMsg()
Switch $Msg
Case -3
_AdlibDisable($Gui)
Exit
Case $RunCheckBox
If GUICtrlRead($RunCheckBox) = 1 Then
_AdlibEnable("_TimerFunc", $Gui, 30)
Else
_AdlibDisable($Gui)
EndIf
EndSwitch
WEnd
Func _AdlibEnable($sFunction, $hWnd, $iTime=250)
GUIRegisterMsg($WM_TIMER, $sFunction)
DllCall("User32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", 50, "int", $iTime, "int", 0)
EndFunc
Func _AdlibDisable($hWnd)
GUIRegisterMsg($WM_TIMER, "")
DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int_ptr", 50)
EndFunc
Func _TimerFunc()
$Left += 2
If $Left >= 300 Then $Left = -200
ControlMove($Gui, "", $Label, $Left, 100)
EndFunc
1. Можно ли скрыть диалоговые окна при автоустановке приложений через AutoIt?
2. Почему в скриптах для автоустановки приложений вначале закомментированы строки с блокировкой ввода? Бывают проблемы?
Rogalik,
1. Да, см. функцию WinSetState("Title", "Text", @SW_HIDE).
2. Проблемы бывают в частности и за того что пользователь “произвольничает” в момент установки :) , но скрипт должен быть оптимизирован так, чтобы пользователь ничего немог нарушить - блокирвание ввода должно ставиться в крайних случаях.
HORRIBLE
09-12-2007, 22:11
----------------------------------------------
Подскажите пожалуйста как можно сделать проверку выполнения скрипта, а именно не застыл ли он на какой нить строчке???
Если застыл то закрываем работу скрипта.
-----------------------------------------------------------------------------------------------------------------
Может кто нить сталкивался с таким, почему на виртуальной машинке при установки программы через авто ит, не срабатывает команда Send("^c"), должен скопировать, а не копирует, или Send("^v") должен вставить то что скопировал, а вставляет v. Проверил тот же самый скрипт на другом компе, не на виртуальной машине, все замечательно копируется и вставляется.
Спасибо.
HORRIBLE, Сам сталкиваюсь часто с такими ситуациями. Мне видится, что если бы скрипт выполнялся построчно другим автоит скриптом, с этим бы не было проблем! Поэтому то (в дополнение кдругим причинам) хочется иметь аналог BSPI или WMI написанный на автоит!!!
А для копирования вставки попробуй использовать пару: ClipPut($nm)
Send('+{Ins}')
Rogalik,
1. Да, см. функцию WinSetState("Title", "Text", @SW_HIDE). »
Но тогда нельзя будет работать с его контролами, нажимать там кнопочки, ставить галочки...
Т.е. при автоустановке программ окна инсталлятора и автоматические действия скрипта с ними приходится наблюдать полюбому, так?
Rogalik,
Но тогда нельзя будет работать с его контролами
Вопрос был в том, можно ли скрыть окно :)
Да, в скрытых окнах нажать ничего нельзя, но можно в свёрнутых (WinSetState("Title", "Text", @SW_MINIMIZE)) ;).
Да, в скрытых окнах нажать ничего нельзя, но можно в свёрнутых (WinSetState("Title", "Text", @SW_MINIMIZE)) . »
Спасибо!
Все равно не получается silent-установки, как я хотел, жаль :(
HORRIBLE
10-12-2007, 17:04
А каким образом запустить 1.msi, если он на ходиться в C:\1\2\1.msi, через скрипт Auto It, который находится в корне, а не в папке с установщиком.
TERMINAL
10-12-2007, 18:00
HORRIBLE,
Global $filename = "\1\2\1.msi", $file = @HomeDrive & $filename
RunWait ( 'msiexec /i "'&$file&'"')
Должно работать...
HORRIBLE
10-12-2007, 23:49
Спасибо все работает TERMINAL,
А скажи зачем $file заключать в 3-ые ковычки????
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.