Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
Maza Faka
04-09-2007, 16:12
Creat0R
В итоге сделал так:
Dim $dest = "c:\Адреналин.avi", $i = 0
Run(@ComSpec & " /c copy /y d:\Video\Films\Адреналин.avi " & $dest, "", @SW_HIDE)
ProgressOn("Please wait...", "Copying file", "", -1, -1, 16)
AdlibEnable("Check", 500)
While 1
Sleep(100)
WEnd
Func Check()
If FileMove($dest, $dest, 1) Then
AdlibDisable()
ProgressSet(100, "Done")
Sleep(500)
Exit
Else
$i += 10
If $i > 100 Then $i = 0
ProgressSet($i, "file copyied")
EndIf
EndFunc
Maza Faka,
В итоге сделал так:
Тоже вариант. А зачем делать If FileMove($dest, $dest, 1) Then? можно просто проверять завершился ли дочерний процесс (PID возвращённый от Run() ).
Я кстати в своём примере немного переборщил :) - Нужно было наоборот, запускать в главном цикле сам прогресс, а в отдельном процессе копирование, и тогда скррипт намного аккуратнее и короче:
Dim $source = "d:\Video\Films\Адреналин.avi", $dest = "c:\Адреналин.avi", $i = 0
ProgressOn("Please wait...", "Now copying file", "", -1, -1, 16)
$CopyPid = Run(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteLine "FileCopy(''' & $source & ''', ''' & $dest & ''')"')
While ProcessExists($CopyPid)
$i += 1
If $i = 100 Then $i = 0
ProgressSet($i, $i & " percent")
Sleep(200)
Wend
ProgressSet(100, "Done")
Sleep(1000)
ProgressOff()
Creat0R
Вопрос только в том, какой метод болшье использует ресурсов, ведь в твоём примере используется Dll'ка (посылая сообщения) при каждом нажатии мышки... а в моём примере при движении мышки
А может наоборот... В твоём примере при каждом движении мышки, а в моём примере только при нажатии? ;) Как бы там ни было у тебя используются две функции, а у меня всего одна. :tongue:
P.S. ...имхо, не предмет для спора, оба варианта хороши. :)
Diamond,
А может наоборот... В твоём примере при каждом движении мышки, а в моём примере только при нажатии?
Ну я вроде так и написал ;) (в обратном порядке).
у тебя используются две функции, а у меня всего одна
Да, вторая чтобы определить где находиться курсор, чтобы не тащить окно если курсор мышки, к примеру, над линией границы окна, или над Title Bar...
не предмет для спора
Я не ради спора (вообще спорить не люблю), я просто привёл альтернативу которой до сих пор сам пользовался, теперь точно буду использовать твой метод, он менее требователен к ресурсам и быстро применим к разным скриптам ;).
Creat0R,
Ну я вроде так и написал (в обратном порядке).
Значит я неправильно понял... :)
я просто привёл альтернативу которой до сих пор сам пользовался, теперь точно буду использовать твой метод, он менее требователен к ресурсам и быстро применим к разным скриптам
А я использовал метод со стилем, думаю что он совсем не требователен к ресурсам, но считаю что этот метод "не оригинален":
#include <GuiConstants.au3>
$HWnd = GUICreate("DRAG_ELEMENT",320,240,-1,-1,$WS_OVERLAPPEDWINDOW)
;~ --- Фоновое изображение (должно быть первым элементом!):
$BgPic=GUICtrlCreatePic(@WindowsDir & '\Web\Wallpaper\Windows XP.jpg',0,0,800,600)
GUICtrlSetPos (-1,0,0,320,240)
GUICtrlSetResizing (-1,$GUI_DOCKBORDERS)
GUICtrlSetState (-1,$GUI_DISABLE)
;~ --- Все остальные элементы:
$butt1=GUICtrlCreateButton("test_button",10,10,70,20)
;~ ...и т.д.
;~ --- Элемент перетаскивания (должен быть последним!):
$DRAG_ELEMENT=GUICtrlCreatePic('',0,0,320,240,-1,$GUI_WS_EX_PARENTDRAG)
GUICtrlSetResizing(-1,$GUI_DOCKBORDERS)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Помогите разобраться:
при установке из командной строки - все ОК!
start /wait msiexec.exe /i "PROMT Expert 7 Giant.msi"KBRIYPGWNEULCSJAQHXOFVM=хххххххх pidkey=хххххххххх-хххх /qb
а из под AutoIt ну ни как :(
Global $file=@ScriptDir & '\PROMT Expert 7 Giant.msi'
;установка PROMT Expert 7 Giant
RunWait ( 'msiexec /i' & $file & " KBRIYPGWNEULCSJAQHXOFVM=" & 'хххххххх' & " pidkey=" & 'хххххххххх-хххх' & ' /qb' )
переименовываю PROMT Expert 7 Giant.msi в setup.msi
Global $file=@ScriptDir & '\setup.msi'
;установка PROMT Expert 7 Giant
RunWait ( 'msiexec /i' & $file & " KBRIYPGWNEULCSJAQHXOFVM=" & 'хххххххх' & " pidkey=" & 'хххххххххх-хххх' & ' /qb' )
все ставится.
В чем моя проблема?
gvshil,
В чем моя проблема?
Полагаю что в первом случае, из за того что присутствуют пробелы путь оказывается неверным...
Global $file=@ScriptDir & '\PROMT Expert 7 Giant.msi' ;установка PROMT Expert 7 Giant
RunWait ('msiexec.exe /i "' & $file & '" KBRIYPGWNEULCSJAQHXOFVM=хххххххх pidkey=хххххххххх-хххх /qb')
Creat0R,
из за того что присутствуют пробелы путь оказывается неверным.. »
а как это исправить? Не знаю, как в командной стоке не получается (с кавычками..)
gvshil,
а как это исправить?
Ты пробовал пример что я дал? он не работает?
Creat0R,
Спасибо огромное, все работает. Не посмотрел, думал, что повтор моего куска!
Спросил я на оф. форуме (http://www.autoitscript.com/forum/index.php?s=&showtopic=52757&view=findpost&p=398988) про такую фичу как пристыковка окна GUI к краям экрана, дали мне (http://www.autoitscript.com/forum/index.php?s=&showtopic=52757&view=findpost&p=399069) почти полноценное решение...
Осталось решить две значительные проблемы перед тем как можно будет использовать данную фичу:
1) В момент смещения окна к краям (в процессе пристыковки) курсор мышки как бы остаётся позади и смещается, что в конце (если достаточно поиграться :)) приводит к тому, что курсор мышки "гуляет" по приделам GUI-окна ;).
2) Панель задачь не всегда находится внизу, и не всегда имеет один размер, нужно как то получать размеры рабочей области, т.е только те границы между панелью задач и краями экрана - и соответственно пристыковывать окно.
Вот что на данный момент имеется:
#include <GUIConstants.au3>
Const $Range = 20
Const $WM_MOVING = 0x0216
Const $WM_ENTERSIZEMOVE = 0x0231
Global $X_START, $Y_START
$Gui = GUICreate("Attach Window GUI to screen edge", 350, 200)
GUISetState()
GUICtrlCreateLabel("Притащите окно к краям экрана ;)", 0, 80, 350, 30, $ES_CENTER)
GUICtrlSetFont(-1, 14, 800)
GUIRegisterMsg($WM_ENTERSIZEMOVE, "WM_ENTERSIZEMOVE")
GUIRegisterMsg($WM_MOVING, "WM_MOVING")
While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd
Func WM_ENTERSIZEMOVE()
Local $aMPos = MouseGetPos()
$X_START = $aMPos[0]
$Y_START = $aMPos[1]
EndFunc
Func WM_MOVING($hWnd, $Msg, $wParam, $lParam)
Local $TaskBarPos = WinGetPos("[CLASS:Shell_TrayWnd]")
Local $hWndPos = WinGetPos($hWnd)
Local $aMPos = MouseGetPos()
Local $Rect = DllStructCreate("long left; long top; long right; long bottom", $lParam)
$Left = DllStructGetData($Rect, "left")
$Top = DllStructGetData($Rect, "top")
$Right = DllStructGetData($Rect, "right")
$Bottom = DllStructGetData($Rect, "bottom")
If $Left <= $Range And $aMPos[0] < $X_START Then
DllStructSetData($Rect, "left", 0)
DllStructSetData($Rect, "right", $Right-$Left)
EndIf
If $Top <= $Range And $aMPos[1] < $Y_START Then
DllStructSetData($Rect, "top", 0)
DllStructSetData($Rect, "bottom", $Bottom-$Top)
EndIf
If $Right >= (@DesktopWidth - $Range) And $aMPos[0] > $X_START Then
DllStructSetData($Rect, "right", @DesktopWidth)
DllStructSetData($Rect, "left", (@DesktopWidth-$Right)+$Left)
EndIf
If $Bottom >= ($TaskBarPos[1] - $Range) And $aMPos[1] > $Y_START Then
DllStructSetData($Rect, "bottom", $TaskBarPos[1])
DllStructSetData($Rect, "top", ($TaskBarPos[1]-$Bottom)+$Top)
EndIf
WM_ENTERSIZEMOVE()
EndFunc
Может у кого то есть время/желание с этим разобраться, очень полезная фича получается (для некоторых задумок).
Maza Faka
10-09-2007, 12:15
Как сделать, что бы элемент "Нет", менял позицию при наведении на него курсора мыши?
#include <GUIConstants.au3>
Opt("MouseCoordMode", 2)
Dim $x, $y
GUICreate("Test", 300, 200)
$yes = GUICtrlCreateButton("Да", 20, 50, 50)
$no = GUICtrlCreateButton("Нет", 200, 50, 50)
$label = GUICtrlCreateLabel("Довольны ли вы своей зарплатой?", 50, 10, 200, 20)
GUISetState()
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $yes
MsgBox(64, "Да", "Мы так и думали!")
ExitLoop
Case $msg = $no
GUICtrlSetPos($no, Random(250), Random(170))
EndSelect
WEnd
Maza Faka,
что бы элемент "Нет", менял позицию при наведении на него курсора мыши?
Можно так:
#include <GUIConstants.au3>
Opt("MouseCoordMode", 2)
Dim $x, $y, $ChangedPos = False
$Gui = GUICreate("Test", 300, 200)
$yes = GUICtrlCreateButton("Да", 20, 50, 50)
$no = GUICtrlCreateButton("Нет", 200, 50, 50)
$label = GUICtrlCreateLabel("Довольны ли вы своей зарплатой?", 50, 10, 200, 20)
GUISetState()
While 1
$msg = GUIGetMsg()
$CurInfo = GUIGetCursorInfo($Gui)
If $CurInfo[4] = $no And Not $ChangedPos Then
GUICtrlSetPos($no, 20, 50)
GUICtrlSetPos($yes, 200, 50)
$ChangedPos = True
ElseIf $CurInfo[4] = $no And $ChangedPos Then
GUICtrlSetPos($no, 200, 50)
GUICtrlSetPos($yes, 20, 50)
$ChangedPos = False
EndIf
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $yes
MsgBox(64, "Да", "Мы так и думали!")
ExitLoop
Case $msg = $no
GUICtrlSetPos($no, Random(250), Random(170))
EndSelect
WEnd
Maza Faka
11-09-2007, 09:54
Creat0R
Спасибо, сделал так:
#include <GUIConstants.au3>
Dim $x, $y, $ChangedPos = False
$Gui = GUICreate("Test", 300, 200)
$yes = GUICtrlCreateButton("Да", 20, 50, 50)
$no = GUICtrlCreateButton("Нет", 200, 50, 50)
$label = GUICtrlCreateLabel("Довольны ли вы своей зарплатой?", 50, 10, 200, 20)
GUISetState()
While 1
$msg = GUIGetMsg()
$CurInfo = GUIGetCursorInfo($Gui)
If $CurInfo[4] = $no Then GUICtrlSetPos($no, Random(240), Random(180))
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $yes
MsgBox(64, "Да", "Мы так и думали!")
ExitLoop
EndSelect
WEnd
Maza Faka,
Я так понял нужно чтобы при навидении на кнопку “Нет” кнопка постоянно "пряталась"? :)
Тогда желательно найти уникальные координаты, т.е убедиться что текущие найденные по Random не являются координатами кнопки "Да" (что не исключено ;) ) ...
#include <GUIConstants.au3>
Dim $x, $y, $ChangedPos = False
$Gui = GUICreate("Test", 300, 200)
$yes = GUICtrlCreateButton("Да", 20, 50, 50, 25)
$no = GUICtrlCreateButton("Нет", 200, 50, 50, 25)
$label = GUICtrlCreateLabel("Довольны ли вы своей зарплатой?", 50, 10, 200, 20)
GUISetState()
While 1
$msg = GUIGetMsg()
$CurInfo = GUIGetCursorInfo($Gui)
If $CurInfo[4] = $no Then
$CurrentCoords = ControlGetPos($Gui, "", $no)
$Random_Left_Coords = Random(20, 250, 1)
$Random_Top_Coords = Random(30, 160, 1)
While $Random_Left_Coords > 20 And $Random_Left_Coords < 70
$Random_Left_Coords = Random(20, 250, 1)
WEnd
While $Random_Top_Coords > 30 And $Random_Top_Coords < 75
$Random_Top_Coords = Random(30, 160, 1)
WEnd
GUICtrlSetPos($no, $Random_Left_Coords, $Random_Top_Coords)
EndIf
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $yes
MsgBox(64, "Да", "Мы так и думали!")
ExitLoop
EndSelect
WEnd
P.S
Я подобными приколами тоже по началу баловался, правда тема была другая - "Вы желаете форматировать диск C:\ ?" :biggrin:
Вышла новая версия AutoIt v3.2.8.1 (10th September, 2007) (http://www.autoitscript.com/autoit3/downloads.php)
Список изменении по сравнению с 3.2.6.0:
8th September, 2007 - v3.2.8.1
Fixed: Possible crash with StringRegExp().
8th September, 2007 - v3.2.8.0
Changed: General speed improvements (currently up to 24% in some cases compared to 3.2.6.0).
Changed: PCRE regular expression engine updated to 7.3.
Changed: Recursion-based code limits relaxed.
Added: wchar type added to DllStructCreate().
Added: WinMove() speed parameter.
Fixed: Crash on AutoIt exit if TrayCreateItem() is not deleted.
Fixed: AutoIt crash on bad parameter when calling TrayCreateMenu()
Fixed: Character positions used in StringRegExp() not correct for characters > 127 (accents, non-Western)
Fixed: ProcessExist() under Windows 9x.
Fixed: GUISetState(@SW_DISABLE) not disabling keyboard input.
Fixed: Sometimes AutoIt crashes on DllStructGetData() with char[] types.
Fixed: Au3Info restoring last settings at startup.
Fixed: Better handling of notifications when using colored buttons.
Fixed: ControlGetText() crash on Scite windows.
Fixed: $LVSCW_AUTOSIZE column truncates display string.
Fixed: Incorrect listview creation with GUICtrlCreateListView().
Fixed: Memory leak when AutoIt needed to get long file name.
Fixed: ListviewItem not created after other child Window creation/deletion.
Fixed: ControlGetFocus() returning bad ClassNN values.
Fixed: Detection of invalid CONTINUELOOP statement.
P.S
3 бага из этого списка я зарепортил:
1. GUISetState(@SW_DISABLE) not disabling keyboard input. (http://www.autoitscript.com/forum/index.php?showtopic=51011)
2. ListviewItem not created after other child Window creation/deletion. (http://www.autoitscript.com/forum/index.php?showtopic=52629)
3. Detection of invalid CONTINUELOOP statement. (http://www.autoitscript.com/forum/index.php?showtopic=52132)
;)
mikola1983
12-09-2007, 09:27
а как скопировать файл с помошью автоит... желательно зашить его в файл.ехе подскажите плис)
mikola1983,
а как скопировать файл с помошью автоит... желательно зашить его в файл.ехе
Если ты имеешь ввиду как вложить файл в скомпилированный скрипт - с помощью функции FileInstall()
Например:
FileInstall("C:\image.jpg", @TempDir & "\image.jpg", 1)
Первый параметр - путь к файлу (путь не должен содержать переменных или макросов)
Второй параметр - путь для извлечения
И наконец третий параметр определяет, будет ли перезаписываться файл при извлечении если файл с таким же именем в этом пути уже существует.
Добавлено:
Совсем не факт что файл будет извлечён сразу при запуске скомпилированного скрипта.
Эту фунцию можно закрыть условием или событием, тогда файл будет извлечён только если событие произошло (В моём примере при нажатии кнопки "Да")
If MsgBox(4+32,"Извлечение файла","Хотите извлечь файл?") = 6 Then
$install = FileInstall("C:\image.jpg", @ScriptDir & "\image.jpg")
If $install Then
MsgBox(0,"Извлечение файла","Файл " & @ScriptDir & "\image.jpg успешно извлечён.")
Else
MsgBox(16,"Извлечение файла","Ошибка извлечения!")
EndIf
EndIf
Функция Get_KeyDown() прекрасно реагирует на нажатие кнопок на клавиатуре, но стоит только прописать кнопку или другой элемент, и событие перестаёт обрабатываться. :dont-know
Кто нибудь может объяснить подобное поведение?
#include <GUIConstants.au3>
$HWnd = GUICreate("KEYDOWN_TEST",400,300)
;~ $BUTTON = GUICtrlCreateButton("Button",10,10,50,20)
Global Const $WM_KEYDOWN = 0x0100
GUIRegisterMsg($WM_KEYDOWN,"Get_KeyDown")
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEnd
Func Get_KeyDown($HWnd,$Command,$wParam,$lParam)
MsgBox(262144,"Код нажатой кнопки:",BitAND($wParam,0xFF))
EndFunc
Oldschool
12-09-2007, 17:48
Ищу репетитора по AutoIt на пару - тройку уроков в Москве.
предложения в ПМ
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC