Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: gregaz
Дата сообщения: 05.06.2008 16:46
ViSiToR
Цитата:
Как стандартную кнопку не думаю, можно пункт меню использовать как кнопку...

Спасибо это вполне устраивает
Если можно то еше вопрос :
Как правильно организовать опрос Если Контролы меню в виде массива букв алфавита
(MenuItem[$array]) , а их достаточно много(>60) ?
Я делал так :

Код:
While 1
$msg = GUIGetMsg()    
For $iMsg=1 To UBound($MenuItem)-1
Switch $msg
     Case $MenuItem[$iMsg]
         ;========
EndSwitch
Next
Switch $msg
Case ........
Case ........
EndSwitch
WEnd
Автор: dfHunter
Дата сообщения: 05.06.2008 17:32
каким образом можно писать в edit'e разными цветами?
например
[12:00:00] Loading...
Автор: Hackproof
Дата сообщения: 05.06.2008 17:44
Vizitor, Maza Faka - спасибо.
Автор: ViSiToR
Дата сообщения: 05.06.2008 23:17
gregaz 17:46 05-06-2008
Цитата:
Как правильно  это выполнить ?

По идее можно так:


Код: #include <GuiConstants.au3>

Global $MenuItem[11]

$GUI = GUICreate("Test Script", 300, 200)

$hMenu = GUICtrlCreateMenu("Items")

For $i = 1 To 10
$MenuItem[$i] = GUICtrlCreateMenuItem("Item" & $i, $hMenu)
Next

GUISetState(@SW_SHOW, $GUI)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case
$MenuItem[1] To $MenuItem[UBound($MenuItem)-1]
MsgBox(64, "", "Clicked: " & GUICtrlRead($nMsg, 1) & @LF, 0, $GUI)
EndSwitch
WEnd
Автор: gregaz
Дата сообщения: 06.06.2008 05:33
ViSiToR , спасибо большое

Цитата:
Но такие обработки лучше делать через режим OnEvent.

Действительно так
Автор: realister12
Дата сообщения: 07.06.2008 12:43
помогите сделать скрипт, который должен:
- запускать MS Word
- "медленно" набирать определенный текст
- демонстрировать его некоторый период времени
- закрывать ворд, ничего не сохраняя
Автор: Maza Faka
Дата сообщения: 07.06.2008 13:43
realister12

Цитата:
помогите сделать скрипт

Ты сам сможешь написать такой скрипт Используй функции:
Run()
Send()
ControlSend()
Sleep
Автор: AmdAd
Дата сообщения: 07.06.2008 13:57
realister12
сам токо начал разбираться с этой прогой... вот переделал пример с калькулятором под твои нужды
[more]
;
; AutoIt Version: 3.0
; Language: English
; Platform: Win9x/NT
; Author: Jonathan Bennett (jon@hiddensoft.com)
;
; Script Function:
; Plays with the calculator.
;


; Prompt the user to run the script - use a Yes/No prompt (4 - see help file)
$answer = MsgBox(4, "AutoIt Example (English Only)", "This script will run the calculator and type in 2 x 4 x 8 x 16 and then quit. Run?")


; Check the user's answer to the prompt (see the help file for MsgBox return values)
; If "No" was clicked (7) then exit the script
If $answer = 7 Then
MsgBox(0, "AutoIt", "OK. Bye!")
Exit
EndIf


; Run the calculator
Run("C:\Program Files\Windows NT\Accessories\wordpad.exe")


; Wait for the calulator become active - it is titled "Calculator" on English systems
WinWaitActive("Документ - WordPad")


; Now that the calc window is active type 2 x 4 x 8 x 16
; Use AutoItSetOption to slow down the typing speed so we can see it
AutoItSetOption("SendKeyDelay", 400)
Send("2*4*8*16=")
Sleep(2000)


; Now quit by sending a "close" request to the calc
WinClose("Документ - WordPad")

WinWaitActive("WordPad")
send("{TAB}")
send("{ENTER}")
; Now wait for calc to close before continuing
WinWaitClose("Документ - WordPad")


; Finished!


[/more]
Автор: ViSiToR
Дата сообщения: 07.06.2008 14:11
realister12 13:43 07-06-2008
Цитата:
- запускать MS Word
- "медленно" набирать определенный текст
- демонстрировать его некоторый период времени
- закрывать ворд, ничего не сохраняя



Код: #include <Word.au3>

;Создаём документ Word'а
$oWord = _WordCreate()

;Получаем информацию о версии Word'а
$aWordVerInfo = _Word_VersionInfo()

;Устанавливаем скорость набора символов (20 мс)
Opt("SendKeyDelay", 20)

;Фокусируем элемент ввода текста, и посылаем нужный текст
$sTextToSend = "Это демонстрация возможностей AutoIt'а в сфере управления COM-объектами."

ControlFocus("[CLASS:OpusApp]", "", "[CLASS:_WwG]")
ControlSend("[CLASS:OpusApp]", "", "[CLASS:_WwG]", $sTextToSend, 1)
ControlSend("[CLASS:OpusApp]", "", "[CLASS:_WwG]", "{ENTER 2}")

Sleep(200)

ControlSend("[CLASS:OpusApp]", "", "[CLASS:_WwG]", "Версия Word'а: " & $aWordVerInfo[5], 1)
ControlSend("[CLASS:OpusApp]", "", "[CLASS:_WwG]", "{ENTER 2}")

;Ждём 5 секунд и оотображаем процесс ожидание в документе
$iTimer = 0

ControlSend("[CLASS:OpusApp]", "", "[CLASS:_WwG]", "Завершение через...", 1)

While $iTimer <= 5
If $iTimer = 5 Then
ControlSend("[CLASS:OpusApp]", "", "[CLASS:_WwG]", 0)
Else
ControlSend("[CLASS:OpusApp]", "", "[CLASS:_WwG]", 5 - $iTimer & ", ")
EndIf

Sleep(1000)
$iTimer += 1
WEnd

ControlSend("[CLASS:OpusApp]", "", "[CLASS:_WwG]", "{ENTER}Завершение.")
Sleep(1000)

;Закрываем документ без подтверждения/сохранения
_WordQuit($oWord, 0)
Автор: realister12
Дата сообщения: 07.06.2008 22:02
Спасибо всем откликнувшимся, но:
вариант от AmdAd просто запускает вордпад;
вариант от ViSiToR просто висит в трее некоторое время:)
скажите где я неправ

Автор: Maza Faka
Дата сообщения: 08.06.2008 07:54
realister12

Цитата:
вариант от ViSiToR просто висит в трее некоторое время

У меня работает. Word установлен?
Автор: realister12
Дата сообщения: 08.06.2008 11:29
Туплю, проверял на виртуалке и забыл что она без оффиса. Всё заработало, но хотелось бы еще уточнить можно ли принудительно увеличить шрифт через скрипт?

(AutoItSetOption("TrayIconHide", 1); сам нашел)
Автор: Hackproof
Дата сообщения: 08.06.2008 21:51
Можно. Либо вычислить ID менюшки с размером и GuiCtrlSetData, или второй вариант - послать ctrl+shif+p (комбинация для смены размера), размер шрифта и Enter.
send ("^+p16{ENTER}") - вроде так, для 16-го шрифта.
Или 100% вариант, через объект команду изобразить. Но это я не знаю, надо спрашивать у тех, кто пример давал выше.

А что насчет рисования в окне программы? Если к примеру, у меня есть $TimeInSecs и $Data, и мне надо построить график изменений $Data по вертикали за минуту причем в реальном времени, то есть график должен строиться минуту, по одной линии каждую секунду.
Автор: ViSiToR
Дата сообщения: 09.06.2008 02:14
realister12 12:29 08-06-2008
Цитата:
можно ли принудительно увеличить шрифт через скрипт?

Можно, вот пример некоторых возможностей COM-объектов для Word'а:


Код: #include <Word.au3>

$oWord = ObjCreate("Word.Application")

$oWord.Visible = True
$oWord.Documents.Add

$sOld_FontName = $oWord.Selection.Font.Name
$sOld_FontSize = $oWord.Selection.Font.Size

$oWord.Selection.TypeText("this is a ")

With $oWord.Selection.Font
.Bold = True
.Italic = False
.Size = 13
.Name = "Georgia"
EndWith

$oWord.Selection.TypeText("Bold ")

With $oWord.Selection.Font
.Bold = False
.Italic = False
.Size = $sOld_FontSize
.Name = $sOld_FontName
EndWith

$oWord.Selection.Font.Bold = False
$oWord.Selection.TypeText("test.")

$oWord.ChangeFileOpenDirectory(@DesktopDir)
$oWord.ActiveDocument.SaveAs("Test.doc")

Sleep(2000)
$oWord.Application.Quit
Автор: zero1632
Дата сообщения: 09.06.2008 12:46
Подскажите пожалуйста, чем можно вы яснить время работы определенной программы.
То есть определить сколько она байт записала прочитала -это в функциях есть, а вот определить сколько времени она уже работает - невозможно.
Автор: ViSiToR
Дата сообщения: 09.06.2008 20:00
zero1632 13:46 09-06-2008
Цитата:
определить сколько времени она уже работает - невозможно

Возможно...


Код:
$sProcUpTimeByName = _ProcessUpTime("SciTE.exe") ;By Process Name
$sProcUpTimeByPID = _ProcessUpTime(ProcessExists("SciTE.exe")) ;By Process ID
$sProcUpTimeByPath = _ProcessUpTime(@AutoItExe) ;By Path

MsgBox(64, "Results", _
StringFormat("UpTime:\n\nBy Name: %s\nBy PID: %s\nBy FilePath: %s", _
$sProcUpTimeByPID, $sProcUpTimeByName, $sProcUpTimeByPath))

Func _ProcessUpTime($sProcID_Name, $iFlag = 1)
If IsNumber($sProcID_Name) And Not ProcessExists($sProcID_Name) Then Return SetError(1, 1, 0)

Local $strComputer = "localhost"
Local $oWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")

Local $iProcIsPath = StringInStr($sProcID_Name, "\")

If $iProcIsPath Then
$sQuery = "SELECT * FROM Win32_Process"
ElseIf IsNumber($sProcID_Name) Then
$sQuery = "SELECT * FROM Win32_Process WHERE ProcessId = " & $sProcID_Name
Else
$sQuery = "SELECT * FROM Win32_Process WHERE Name = '" & $sProcID_Name & "'"
EndIf

Local
$oColItems = $oWMIService.ExecQuery($sQuery, "WQL", 0x10 + 0x20)
If Not IsObj($oColItems) Then Return SetError(2, 1, 0)

For $oItem In $oColItems
If $iProcIsPath And $oItem.ExecutablePath <> $sProcID_Name Then ContinueLoop

If
$iFlag Then
Return
_
StringMid($oItem.CreationDate, 5, 2) & "/" & _
StringMid($oItem.CreationDate, 7, 2) & "/" & _
StringLeft($oItem.CreationDate, 4) & " " & _
StringMid($oItem.CreationDate, 9, 2) & ":" & _
StringMid($oItem.CreationDate, 11, 2) & ":" & _
StringMid($oItem.CreationDate,13, 2)
Else
Return
$oItem.CreationDate
EndIf
Next
EndFunc
Автор: XpycTMD
Дата сообщения: 10.06.2008 12:56
Есть скрипт компилируется при помощи AutoIt3Wrapper'а
В секции AutoIt3Wrapper'а есть строчка

Код: #AutoIt3Wrapper_Res_Fileversion=0.0.0.0
Автор: ViSiToR
Дата сообщения: 10.06.2008 17:02
XpycTMD 13:56 10-06-2008
Цитата:
чтобы переменная например $Version принимала значение этой строчки

Можно читать весь скрипт и искать эту строку с RegExp...


Код:
#AutoIt3Wrapper_Res_Fileversion=0.0.0.0

$sRes_Fileversion = StringRegExpReplace(FileRead(@ScriptFullPath), "(?i)(?s).*?#AutoIt3Wrapper_Res_Fileversion=(.*?)\r.*$", "\1")

ConsoleWrite($sRes_Fileversion)
Автор: Maza Faka
Дата сообщения: 10.06.2008 17:16
XpycTMD

Цитата:
Как сделать так чтобы переменная например $Version принимала значение этой строчки

Честно говоря не совсем понял суть вопроса, рискну угадать

Код: #AutoIt3Wrapper_Res_Fileversion=0.0.0.0
#include <GuiConstantsEx.au3>

$file = FileOpen(@ScriptFullPath, 0)
If @error Then Exit

While
1
$read = FileReadLine($file)
If @error = -1 Then ExitLoop
If
StringRegExp($read, "^#AutoIt3Wrapper_Res_Fileversion", 0) Then $var = StringRegExpReplace($read, "^.*=", "")
WEnd

FileClose($file)

MsgBox(0, "Message", "Current version is: " & $var)

$hGUI = GUICreate("Test GUI", 300, 200)

GUISetState()

Do
Until
GUIGetMsg() = $GUI_EVENT_CLOSE
Автор: XpycTMD
Дата сообщения: 10.06.2008 21:06
ViSiToR
Maza Faka
Спасибо за советы.

Я вот тут подумал и решил использовать FileReadLine так как параметр находится на определенной строчке получилось вот такое

Код: ....
....
....
10 #AutoIt3Wrapper_Res_Fileversion=0.0.0.0
....
....
....
20 $Version = StringSplit(FileReadLine(@ScriptName, 10), "=")
21 $Version = $Version[2]
22 ConsoleWrite("$Version = " & $Version & @CR)
Автор: ViSiToR
Дата сообщения: 10.06.2008 22:10
XpycTMD 22:06 10-06-2008
Цитата:
решил использовать FileReadLine так как параметр находится на определенной строчке

Тогда легче без сплита...


Код: ....
....
....
10 #AutoIt3Wrapper_Res_Fileversion=0.0.0.0
....
....
....
20 $Version = StringRegExpReplace(FileReadLine(@ScriptFullPath, 10), ".*=(.*)$", "\1")
21 ConsoleWrite("$Version = " & $Version & @CR)
Автор: NIKZZZZ
Дата сообщения: 10.06.2008 22:57
А не проскакивало ли где-либо патчей скомпилированного скрипта или бинарника, позволяющих уменьшить ресурсы, им резервируемые?
Простая програмка

Код: While 1
WEnd
Автор: XpycTMD
Дата сообщения: 11.06.2008 00:21
ViSiToR
Да согласен, просто не заметил
Спасибо за зовет

А вроде как @ScriptName сробатывает неважно откуда ты запускаеш скрип / компиляцию
Просто @ScriptFullPath чуть медленее сработае из-за определения пути к скрипту
Просто скрип копилизуется зи разных мест (то лаптоп то рабочий комп)
Автор: ViSiToR
Дата сообщения: 11.06.2008 02:18
NIKZZZZ 23:57 10-06-2008
Цитата:
отжирает памяти 4 Mb !

Не могу подтвердить, у меня обычная конструкция построения GUI забирает всего 1.5 mb.
Но есть UDF для снижения используемой процессом области в памяти:


Код:
_ProcessReduceMemory(@AutoItPID)

Func _ProcessReduceMemory($iPID)
Local $iProcExists = ProcessExists($iPID) ;To get the PID and check process existence
Local $hOpenProc, $aEmptyWorkSet_Ret

If Not $iProcExists Then Return SetError(1, 0, 0)
If IsString($iPID) Then $iPID = $iProcExists

If $iPID = - 1 Then
$aEmptyWorkSet_Ret = DllCall("Psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
Else
$hOpenProc = DllCall('Kernel32.dll', 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $iPID)
$aEmptyWorkSet_Ret = DllCall('Psapi.dll', 'int', 'EmptyWorkingSet', 'long', $hOpenProc[0])
DllCall('Kernel32.dll', 'int', 'CloseHandle', 'int', $hOpenProc[0])
EndIf

If Not
IsArray($aEmptyWorkSet_Ret) Then Return SetError(2, 0, 0)
Return $aEmptyWorkSet_Ret[0]
EndFunc
Автор: Maza Faka
Дата сообщения: 11.06.2008 07:43
ViSiToR

Цитата:
Но есть UDF для снижения используемой процессом области в памяти

Отличная UDF! Спасибо!
Снизила потребление памяти с 3392 KB до 944, то есть более чем в 3 раза! Теперь буду включать эту UDF во все свои проекты.
Автор: ViSiToR
Дата сообщения: 11.06.2008 07:57
Maza Faka 08:43 11-06-2008
Цитата:
Теперь буду включать эту UDF во все свои проекты

Я так и делаю, но где то слышал (на оф. форуме по всей видимости ) что не стоит злоупотреблять этой функцией, использовать только после значительной (потенциально?) загрузки памяти. Может привести к вылету скрипта.
Автор: Maza Faka
Дата сообщения: 11.06.2008 08:28
ViSiToR
Ещё меньше потребления памяти! 896 против 944

Код: #include <GuiConstantsEx.au3>

Global Const $PROCESS_ALL_ACCESS = 0x1F0FFF

$hGUI = GUICreate("Test GUI", 300, 200)

GUISetState()

_ProcessReduceMemory(@AutoItPID)

While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd

Func
_ProcessReduceMemory($iPID)
Local $iProcExists = ProcessExists($iPID) ;To get the PID and check process existence
Local $hOpenProc, $aResult

If Not $iProcExists Then Return SetError(1, 0, 0)
If IsString($iPID) Then $iPID = $iProcExists

$hOpenProc
= DllCall('Kernel32.dll', 'int', 'OpenProcess', 'int', $PROCESS_ALL_ACCESS, 'int', False, 'int', $iPID)
$aResult = DllCall("Kernel32.dll", "int", "SetProcessWorkingSetSize", "hwnd", $hOpenProc[0], "int", -1, "int", -1)
DllCall('Kernel32.dll', 'int', 'CloseHandle', 'int', $hOpenProc[0])

If Not IsArray($aResult) Or $aResult[0] = 0 Then Return SetError(2, 0, 0)
Return $aResult[0]
EndFunc
Автор: NIKZZZZ
Дата сообщения: 11.06.2008 10:54
ViSiToR

Цитата:
Но есть UDF для снижения используемой процессом области в памяти:

Полезная штука. Но, к сожалению, такие операции , как Redim, приводят к перераспределению памяти, и _ProcessReduceMemory приходится повторять.
Автор: BabyKiller
Дата сообщения: 11.06.2008 12:14
Подскажите, как передать системе комбинацию ALT с русскими буквами?
Пробую Send("!н") - нифига, печатает просто "н"
Автор: Maza Faka
Дата сообщения: 11.06.2008 12:57
NIKZZZZ

Цитата:
такие операции , как Redim, приводят к перераспределению памяти, и _ProcessReduceMemory приходится повторять

Можно пример? А то у меня увеличение потребления памяти при операции ReDim не происходит.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.