PDA

Показать полную графическую версию : [архив - Часть 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

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

Creat0R
04-09-2007, 17:18
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()

Diamond
05-09-2007, 03:52
Creat0R
Вопрос только в том, какой метод болшье использует ресурсов, ведь в твоём примере используется Dll'ка (посылая сообщения) при каждом нажатии мышки... а в моём примере при движении мышки
А может наоборот... В твоём примере при каждом движении мышки, а в моём примере только при нажатии? ;) Как бы там ни было у тебя используются две функции, а у меня всего одна. :tongue:
P.S. ...имхо, не предмет для спора, оба варианта хороши. :)

Creat0R
05-09-2007, 04:08
Diamond,
А может наоборот... В твоём примере при каждом движении мышки, а в моём примере только при нажатии?
Ну я вроде так и написал ;) (в обратном порядке).

у тебя используются две функции, а у меня всего одна
Да, вторая чтобы определить где находиться курсор, чтобы не тащить окно если курсор мышки, к примеру, над линией границы окна, или над Title Bar...

не предмет для спора
Я не ради спора (вообще спорить не люблю), я просто привёл альтернативу которой до сих пор сам пользовался, теперь точно буду использовать твой метод, он менее требователен к ресурсам и быстро применим к разным скриптам ;).

Diamond
06-09-2007, 08:03
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

gvshil
07-09-2007, 17:17
Помогите разобраться:
при установке из командной строки - все ОК!

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' )

все ставится.
В чем моя проблема?

Creat0R
07-09-2007, 17:46
gvshil,
В чем моя проблема?
Полагаю что в первом случае, из за того что присутствуют пробелы путь оказывается неверным...


Global $file=@ScriptDir & '\PROMT Expert 7 Giant.msi' ;установка PROMT Expert 7 Giant
RunWait ('msiexec.exe /i "' & $file & '" KBRIYPGWNEULCSJAQHXOFVM=хххххххх pidkey=хххххххххх-хххх /qb')

gvshil
07-09-2007, 18:13
Creat0R,
из за того что присутствуют пробелы путь оказывается неверным.. »
а как это исправить? Не знаю, как в командной стоке не получается (с кавычками..)

Creat0R
07-09-2007, 20:42
gvshil,
а как это исправить?
Ты пробовал пример что я дал? он не работает?

gvshil
07-09-2007, 20:58
Creat0R,
Спасибо огромное, все работает. Не посмотрел, думал, что повтор моего куска!

Creat0R
07-09-2007, 21:05
Спросил я на оф. форуме (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

Creat0R
10-09-2007, 16:51
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

Creat0R
11-09-2007, 10:32
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:

Creat0R
12-09-2007, 01:29
Вышла новая версия 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
а как скопировать файл с помошью автоит... желательно зашить его в файл.ехе подскажите плис)

Diamond
12-09-2007, 10:08
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

Diamond
12-09-2007, 10:56
Функция 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