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

SAOPP
07-01-2008, 00:09
Эта утилитка? »
А как же :)

Скрипт завершит работу после любого движения мышки »
Нет, не годится, любое движение мышки, вот если бы по комбинации клавиш тогда хорошо, а движение или нажатие клавиши не годиться :(

Creat0R
07-01-2008, 00:24
SAOPP,
вот если бы по комбинации клавиш тогда хорошо
Ты этот скрипт пробовал запускать?

Я имел в виду после нажатия ALT + CTRL + DEL (ведь в справке к команде BlockInput это говорится), если двинуть мышкой, скрипт завершит работу, а блокирование снимается по нажатию alt ctrl del.

HORRIBLE
07-01-2008, 03:16
Подскажите, а как сделать часы, чтобы время шло ) спасибо.

Creat0R
07-01-2008, 04:10
HORRIBLE,
как сделать часы, чтобы время шло
Имеется в виду таймер?

Типа такого:

#include <GuiConstants.au3>

Global $iTimer_Started = False
Global $Timer_Init = 0, $Total_Seconds = 0

$GUI = GUICreate("Timer Script", 220, 90)

$Timer_Button = GUICtrlCreateButton("Start", 50, 20, 120, 20)
$Timer_Label = GUICtrlCreateLabel("00:00:00", 90, 60)

GUISetState(@SW_SHOW, $GUI)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Timer_Button
If $iTimer_Started Then
GUICtrlSetData($Timer_Button, "Start")
_AdlibDisable($GUI)
Set_Timer()
$Total_Seconds += Round(TimerDiff($Timer_Init)/1000, 1)
Else
GUICtrlSetData($Timer_Button, "Stop")
$Timer_Init = TimerInit()
_AdlibEnable("Set_Timer", 1000, $GUI)
EndIf

$iTimer_Started = Not $iTimer_Started
EndSwitch
WEnd

Func _AdlibEnable($sFunction, $iTime=250, $hWnd=0)
Local Const $WM_TIMER = 0x0113
If Not IsHWnd($hWnd) Then $hWnd = GUICreate("hCallBack_AdlibEnable")
GUIRegisterMsg($WM_TIMER, $sFunction)
Local $aRet = DllCall("User32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", 50, "int", $iTime, "int", 0)
Return $hWnd
EndFunc

Func _AdlibDisable($hWnd=0)
Local Const $WM_TIMER = 0x0113
GUIRegisterMsg($WM_TIMER, "")
Local $aRet = DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int_ptr", 50)
Return Number(IsArray($aRet) And $aRet[0])
EndFunc

Func _SecsToTime($iTicks, $Delim=":")
If Number($iTicks) >= 0 Then
Local $iHours = Int($iTicks / 3600)
$iTicks = Mod($iTicks, 3600)
Local $iMins = Int($iTicks / 60)
Local $iSecs = Round(Mod($iTicks, 60))
If StringLen($iHours) = 1 Then $iHours = "0" & $iHours
If StringLen($iMins) = 1 Then $iMins = "0" & $iMins
If StringLen($iSecs) = 1 Then $iSecs = "0" & $iSecs
Return $iHours & $Delim & $iMins & $Delim & $iSecs
EndIf
Return SetError(1, 0, 0)
EndFunc

Func Set_Timer($hWnd=0)
Local $iTmp_Total_Seconds = Round(TimerDiff($Timer_Init)/1000, 1)
If $Total_Seconds > 0 Then $iTmp_Total_Seconds += $Total_Seconds

Local $sTime = _SecsToTime($iTmp_Total_Seconds)

GUICtrlSetData($Timer_Label, $sTime)
EndFunc

HORRIBLE
07-01-2008, 12:43
Creat0R,
неа, не таймер, хотя за таймер спасибо, а такие же часики как и в винде, вправом нижнем углу.
т.к если просто использовать команды @Hour &":"& @MIN &":"& @SeC то получается когда файлик запускается то время показывается когда файл был запущен, а вот как сдеть чтоб время обновлялось, не перезапуская файл.

Еще подскажите почему ругается вот на это
#include <GuiCombo.au3>

говорит: Error opening the file

Можно ли убрать верхнюю шапку когда создаешь окно GUICreate особенно 3-и стандартных кнопки ?

Creat0R
07-01-2008, 19:45
HORRIBLE,
как сдеть чтоб время обновлялось, не перезапуская файл.
Использовать GuiCtrlSetData()...

#include <GuiConstants.au3>

Global $sTDelim = _GetTimeDelim()

$GUI = GUICreate("Timer Script", 220, 90)

$Time_Label = GUICtrlCreateLabel("Текущее время: " & GetCurrentTime($sTDelim), 40, 60)

$Handle = _AdlibEnable("Set_System_Time", 1000)

GUISetState(@SW_SHOW, $GUI)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_AdlibDisable($Handle, 1)
Exit
EndSwitch
WEnd

Func _AdlibEnable($sFunction, $iTime=250, $hWnd=0)
Local Const $WM_TIMER = 0x0113
If Not IsHWnd($hWnd) Then $hWnd = GUICreate("hCallBack_AdlibEnable")
GUIRegisterMsg($WM_TIMER, $sFunction)
Local $aRet = DllCall("User32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", 1, "int", $iTime, "int", 0)
Return $hWnd
EndFunc

Func _AdlibDisable($hWnd=0, $iCloseHwnd=0)
Local Const $WM_TIMER = 0x0113
GUIRegisterMsg($WM_TIMER, "")
If $iCloseHwnd Then GUIDelete($hWnd)
Local $aRet = DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int", 1)
Return Number(IsArray($aRet) And $aRet[0])
EndFunc

Func Set_System_Time()
GUICtrlSetData($Time_Label, "Текущее время: " & GetCurrentTime($sTDelim))
EndFunc

Func GetCurrentTime($sTDelim=":")
Return @HOUR & $sTDelim & @MIN & $sTDelim & @SEC
EndFunc

Func _GetTimeDelim($sNowTime="")
Local $sRetDelim = RegRead("HKEY_CURRENT_USER\Control Panel\International", "sTime")
If $sRetDelim = "" And $sNowTime <> "" Then $sRetDelim = StringLeft(StringRegExpReplace($sNowTime, "[0-9]", ""), 1)
If $sRetDelim = "" Then $sRetDelim = ":"
Return $sRetDelim
EndFunc

почему ругается вот на это
GuiCombo.au3 переименован в последней версии AutoIt'а, теперь нужно использовать GuiComboBox.au3

Можно ли убрать верхнюю шапку когда создаешь окно GUICreate особенно 3-и стандартных кнопки ?
Если речь про область заголовка, то убрать можно, нужно просто выставить стиль $WS_POPUP без других стилей, а чтобы убрать все кнопки, но при этом оставить область заголовка, нужно выставить только $WS_CAPTION плюс $WS_POPUP...

GUICreate("Title", 300, 100, -1, -1, $WS_CAPTION+$WS_POPUP)

TERMINAL
08-01-2008, 15:56
Creat0R, возможно ли с помощью скрипта менять разрешение экрана и определять на данный момент?

Creat0R
09-01-2008, 00:20
TERMINAL,
возможно ли с помощью скрипта менять разрешение экрана и определять на данный момент?
Да, вот немного изменённые функции (Источник (http://www.autoitscript.com/forum/index.php?s=&showtopic=22074&view=findpost&p=153200)):

#include <Array.au3>

$aDisplayData = DisplayGetResolution()
_ArrayDisplay($aDisplayData, "Current Resolution Values")

;Change to new resolution
DisplayChangeResolution(960, 600, 32, 60)

Sleep(3000)

;Change back to currently used resolution
DisplayChangeResolution($aDisplayData[0], $aDisplayData[1], $aDisplayData[2], $aDisplayData[3])

Func DisplayGetResolution($iIndex=-1)
Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")
Local $aRet[4]

Local $aDllCall = DllCall("user32.dll", "int", "EnumDisplaySettings", _
"ptr", 0, "long", $iIndex, "ptr", DllStructGetPtr($DEVMODE))

If IsArray($aDllCall) And $aDllCall[0] <> 0 Then
$aRet[0] = DllStructGetData($DEVMODE, 4, 2)
$aRet[1] = DllStructGetData($DEVMODE, 4, 3)
$aRet[2] = DllStructGetData($DEVMODE, 4, 1)
$aRet[3] = DllStructGetData($DEVMODE, 4, 5)
Else
Return SetError(1, 0, 0)
EndIf

$DEVMODE = 0

Return $aRet
EndFunc ;==>DisplayGetResolution

Func DisplayChangeResolution($iWidth, $iHeight, $iBpp, $iFreq)
Local Const $DM_PELSWIDTH = 0x00080000
Local Const $DM_PELSHEIGHT = 0x00100000
Local Const $DM_BITSPERPEL = 0x00040000
Local Const $DM_DISPLAYFREQUENCY = 0x00400000
Local Const $CDS_TEST = 0x00000002
Local Const $CDS_UPDATEREGISTRY = 0x00000001
Local Const $DISP_CHANGE_RESTART = 1
Local Const $DISP_CHANGE_SUCCESSFUL = 0
Local Const $HWND_BROADCAST = 0xFFF
Local Const $WM_DISPLAYCHANGE = 0x007E

Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")

Local $avDllCall = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, "ptr", DllStructGetPtr($DEVMODE))

If IsArray($avDllCall) And $avDllCall[0] <> 0 Then
DllStructSetData($DEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
DllStructSetData($DEVMODE, 4, $iWidth, 2)
DllStructSetData($DEVMODE, 4, $iHeight, 3)
DllStructSetData($DEVMODE, 4, $iBpp, 1)
DllStructSetData($DEVMODE, 4, $iFreq, 5)

$avDllCall = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)

If @error Then
$avDllCall = -1
Else
$avDllCall = $avDllCall[0]
EndIf

Select
Case $avDllCall = $DISP_CHANGE_RESTART
$DEVMODE = 0
Return 2
Case $avDllCall = $DISP_CHANGE_SUCCESSFUL
DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
"int", $iBpp, "int", $iHeight * 2 ^ 16 + $iWidth)
$DEVMODE = 0
Return 1
Case Else
$DEVMODE = 0
Return $avDllCall
EndSelect
EndIf
EndFunc ;==>DisplayChangeResolution

В принципе, функцию для получения текущих значении можно заменить макросами...


Func DisplayGetResolution_by_Macro()
Local $aRet[4] = [@DesktopWidth, @DesktopHeight, @DesktopDepth, @DesktopRefresh]
Return $aRet
EndFunc

HORRIBLE
09-01-2008, 16:01
Как сделать поиск по маске, формат имени файла выглядит так (12_12_12.txt), в папке текстовых файлов много и у всех разный формат имени, но есть и файлы с форматом имени таким который был приведен, далее после поиска вывести массив с найденными файлами.
Я так думаю что нужно сперва воспользоваться _FileListToArray ($path ,"*.txt"), а после это этим StringRegExp (). Но я так попробовал, и ничего не вышло

StringRegExp ("12_12_12.txt 12_12_12.txt", ,'(\d\d\w\d\d\w\d\d.\w\w\w\w*?)',4) - если так писать, все прекрасно работат, находит)) а как быть с именем файла?
'(\d\d\w\d\d\w\d\d.\w\w\w\w*?)' - правильно написано или можно как нить подругому задать?



2 вопрос:

_FileCreate("1.txt")
$Array1 = _FileListToArray ($path ,"*.au3")
$Array2 = _ArrayToclip($1)
fileWrite("1.txt",ClipGet())

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

Спасибо.

Creat0R
09-01-2008, 19:46
HORRIBLE, Как сделать поиск по маске, формат имени файла выглядит так (12_12_12.txt), в папке текстовых файлов много и у всех разный формат имени, но есть и файлы с форматом имени таким который был приведен, далее после поиска вывести массив с найденными файлами.
_FileListToArray вернёт массив, поэтому проходиться нужно по всему массиву циклом:

#include <File.au3>
#include <Array.au3>

$sPath = @ScriptDir
$avArray = _RegExpFileListToArray($sPath, "(?i)\d+_\d+_\d+\.txt", "*.txt")

_ArrayDisplay($avArray)

Func _RegExpFileListToArray($sPath, $sPattern, $sMask="*")
Local $aRet[1]

$aFileList = _FileListToArray($sPath, $sMask)

For $i = 1 To UBound($aFileList)-1
If StringRegExp($aFileList[$i], $sPattern) Then
$aRet[0] += 1
ReDim $aRet[$aRet[0]+1]
$aRet[$aRet[0]] = $aFileList[$i]
EndIf
Next

Return $aRet
EndFunc

Если всегда цифр будет только две (между каждым разделителем), то \d+ нужно заменить на \d\d.

как сделать так чтоб информация разделялась, а Enter-ом, чтобы каждое название файла начиналось с новой строки.
А зачем использовать буфер обмена? есть функция _FileWriteFromArray() :).

Функция _ArrayToClip() помещет строчки в буфер обмена разделённые @CR (возврат каретки).

HORRIBLE
10-01-2008, 00:32
Creat0R,
ох большущее спасибо.
_RegExpFileListToArray откуда такие команды??? у меня в хелпе по авто иту нету такого, вы че сами их придумавыете?

_RegExpFileListToArray($sPath, $sPattern, $sMask="*")
в этой команде, что такое $sPattern оно же не где не задано.
$sMask="*" как это понять, тип либой файл чтоли?

Creat0R
10-01-2008, 02:18
HORRIBLE, откуда такие команды??? у меня в хелпе по авто иту нету такого, вы че сами их придумавыете?
Сами :) - по сути _FileListToArray() (и все функции начинающиеся с _ ) тоже самопальная функция.

что такое $sPattern оно же не где не задано.
Оно задано как параметр для фунции, я просто как второй параметр указываю образец (Pattern) для RegExp.

как это понять, тип либой файл чтоли?
Это маска, по которой определяется параметры для поиска файлов, см. функцию FileFindFirstFile().

TERMINAL
11-01-2008, 18:12
Creat0R, не могу заставить выключиться Send("{CAPSLOCK off}") !

Creat0R
11-01-2008, 21:55
TERMINAL,
не могу заставить выключиться Send("{CAPSLOCK off}") !
В справке по этому поводу что-то написано:

You can set SendCapslockMode to make CAPS LOCK disabled at the start of a Send operation and restored upon completion.
However, if a user is holding down the Shift key when a Send function begins, text may be sent in uppercase.
One workaround is to Send("{SHIFTDOWN}{SHIFTUP}") before the other Send operations.

Certain keyboard as the Czech one send different characters when using the Shift Key or being in CAPS LOCK enabled and sending a char. Due to the send AutoIt implementation the CAPS LOCKed char will be sent as Shifted one so it will not work.

а Send("{CAPSLOCK toggle}") работает?

TERMINAL
12-01-2008, 09:16
Creat0R, не неработает, а Num Lock работает....

Vikma19
12-01-2008, 15:07
Creat0R, добрый день!Пишу Вам, т.к. прочитал ваши сообщения на форуме - очень пригодилось. До этого очень много делал программок для работы на VB.
Впервые попробовал Autoit, когда понадобилось перенести данные с листа Excel в Axata.Понравилось.
Вопрос - можно ли объединить Autoit и VB. И второй очень срочный - есть ли скрипт позволяющий работать с Listview,
как с листом ексель, т.е. вводить данные с клавиатуры во все колонки, редактировать и т.д.
Заранее благодарен.

rimm
12-01-2008, 22:16
Прошу кто может помочь с английским переводом описаний функций "Автоматизация MS Internet Explorer", к сожалению в русской справке от Валерия Иванова этот раздел не переведен, самому мне перевести не представляется возможным.
Спасибо всем кто помогал мне в прошлый раз.

Maza Faka
13-01-2008, 07:27
Vikma19
Хоть вопрос и не ко мне...
можно ли объединить Autoit и VB.
VB-script? Можно создавать обьекты и управлять ими как в WSH, пример копирования файлов с отображением системного диалога копирования:
_FileCopy("D:\wallpaper\*.*", "C:\wallpaper")

Func _FileCopy($Source, $Dest)
If Not FileExists($Dest) Then DirCreate($Dest)
$WinShell = ObjCreate("shell.application")
$WinShell.NameSpace($Dest).CopyHere($Source)
EndFunc

второй очень срочный - есть ли скрипт позволяющий работать с Listview,
как с листом ексель, т.е. вводить данные с клавиатуры во все колонки, редактировать и т.д.
Ну как в Excel вряд ли, но в справке есть примеры редактирования Item-ов, вот немного изменённый пример из справки:
#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

rimm
кто может помочь с английским переводом описаний функций "Автоматизация MS Internet Explorer"
А какая именно функция не понятна?

P.S.
Переводить на русский все функции, вряд-ли кто будет, так, как на это нужно время, а по отдельным, спрашивай, чем сможем поможем. :)

Vikma19
13-01-2008, 11:54
Maza Faka, Большое спасибо! Попробую разобраться.

Vikma19
13-01-2008, 12:18
Maza Faka, Редактирование Itemov -понятно, а как с SubItemami(ввел колонку с помощью _GUICtrlListView_AddSubItem
ввел данные) но исправить можно только Item - а как с SubItem и с вводом новых данных в пустую ячейку?
Спасибо.




© OSzone.net 2001-2012