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

» AutoIT

Автор: Tipulatoid
Дата сообщения: 01.11.2008 11:30
Я давно уже задавал похожий вопрос, но всё-таки хотелось бы получить более развернутый ответ.
Стоит задача нарисовать GUI, который бы выводил на экран лог того, чем скрипт занимается. Пример - очень многие инсталляторы (тот же инсталлятор AutoIt'a) по ходу работы выводят на экран сообщения о том, какой файл копируется, какой ключ в реестр пишется и т.д.
Как такое лучше реализовать? Лучше всего, конечно, привести пример кода, который бы, к примеру копировал большой файл; перед началом копирования выводил бы в лог надпись типа
Код: Копирую Dreamers.avi......
Автор: ViSiToR
Дата сообщения: 01.11.2008 15:43
Tipulatoid 11:30 01-11-2008
Цитата:
Лучше всего, конечно, привести пример кода, который бы, к примеру копировал большой файл; перед началом копирования выводил бы в лог надпись типа


В примере нет копирования, только простая имитация (в виде паузы ), но всё что касается вывода лога + цветные предупреждения, есть. Используется объект RICHTEXT.RichtextCtrl (если не работает, нужно скачать и зарегистрировать компонент ActiveX отсюда):


Код: #include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
;

$oCOM_Error = ObjEvent("AutoIt.Error", "MyErrFunc")

$oRichText = ObjCreate("RICHTEXT.RichtextCtrl.1")
;$oRichText.BackColor = 0x0CC0C0

$hGUI = GUICreate("GUI Log Demo", 320, 200, -1, -1, BitOr($GUI_SS_DEFAULT_GUI, $WS_CLIPSIBLINGS))

$GUIActiveX = GUICtrlCreateObj($oRichText, 10, 10, 400, 260)
GUICtrlSetPos($GUIActiveX, 10, 10, 300, 160)

GUISetState()

$hRichEdit = ControlGetHandle($hGUI, "", "RichTextWndClass1")
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hRichEdit, "int", $EM_SETREADONLY, "int", True, "int", 0)

Copy_Process()

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd

Func
Copy_Process()
_Write_GUI_Log("Копирую Dreamers.avi... ", 1, 0x666666)
Sleep(2000)
_Write_GUI_Log("Успешно!" & @CRLF & @CRLF, 1, 0x008000, True)

Sleep(1500)

_Write_GUI_Log("Архивирую Dreamers.avi... ", 1, 0x666666)
Sleep(2000)
_Write_GUI_Log("Ошибка!" & @CRLF & @CRLF, 1, 0x0000FF, True)

Sleep(3000)

For $i = 5 To 1 Step -1
_Write_GUI_Log("Завершение работы через... ", 0)
_Write_GUI_Log($i, 1, 0x0000FF, True)
Sleep(1000)
Next

Exit
EndFunc

Func
_Write_GUI_Log($sData, $iAppend=True, $iColor=0, $iBold=False, $iItalic=False, $iUnderline=False, $iFontSize=8)
Local $sCurrent_Data = $oRichText.Text

Local $iSelStart = StringLen($sCurrent_Data)
Local $iSelLength = StringLen($sData)

With $oRichText
.SelStart = $iSelStart
.SelLength = 0

If $iAppend Then
.SelText = $sData
Else
.Text = $sData
EndIf

.SelStart = $iSelStart
.SelLength = $iSelLength

.SelFontSize = $iFontSize
.SelColor = $iColor
.SelBold = $iBold
.SelItalic = $iItalic
.SelUnderline = $iUnderline

.SelStart = $iSelStart + $iSelLength
EndWith
EndFunc

Func
MyErrFunc()
Msgbox(16, "AutoItCOM Error", _
"We intercepted a COM Error !" & @CRLF & @CRLF & _
"err.description is: " & @TAB & $oCOM_Error.Description & @CRLF & _
"err.windescription:" & @TAB & $oCOM_Error.WinDescription & @CRLF & _
"err.number is: " & @TAB & Hex($oCOM_Error.Number,8) & @CRLF & _
"err.lastdllerror is: " & @TAB & $oCOM_Error.LastDllError & @CRLF & _
"err.scriptline is: " & @TAB & $oCOM_Error.ScriptLine & @CRLF & _
"err.source is: " & @TAB & $oCOM_Error.Source & @CRLF & _
"err.helpfile is: " & @TAB & $oCOM_Error.HelpFile & @CRLF & _
"err.helpcontext is: " & @TAB & $oCOM_Error.HelpContext, 5) ;Will automatically continue after 5 seconds

Local $iErr = $oCOM_Error.Number
If $iErr = 0 Then $iErr = -1

SetError($iErr) ; to check for after this function returns
Endfunc
Автор: Maza Faka
Дата сообщения: 01.11.2008 16:09
ViSiToR
У меня твой скрипт выдаёт ошибку:
Автор: Tipulatoid
Дата сообщения: 01.11.2008 16:24
ViSiToR
Круто - то как. У меня, похоже, действительно, проблемы С COM - объектами - не работает Выдает 4 окна ошибок
Автор: gal7
Дата сообщения: 01.11.2008 16:41
А можно ли как-то узнать установлен ли в каком-либо данном окне курсор или там его нет? Что-то не могу ничего такого найти.
Автор: ViSiToR
Дата сообщения: 01.11.2008 16:47
Maza Faka
Tipulatoid
Ребята, у вас видимо не установлен (или испорчен ) объект RICHTEXT.RichtextCtrl.1...
См. тут возможное решение проблеме (в основном там направляют на страницу с фиксом).

Добавлено:
gal7 16:41 01-11-2008
Цитата:
можно ли как-то узнать установлен ли в каком-либо данном окне курсор или там его нет?

Всмысле узнать какое окно под курсором? Вот пример:


Код: HotKeySet("{ESC}", "Quit")

While 1
Sleep(100)

$aMPos = MouseGetPos()
$hWnd = WindowFromPoint($aMPos[0], $aMPos[1])
$Title = WinGetTitle($hWnd)

If StringInStr($Title, @LF) Then $Title = StringLeft($Title, StringInStr($Title, @LF)-2)
If $Title = "" Then $Title = "No Title [probably a control handle]"

If $hWnd <> WinGetHandle("[CLASS:tooltips_class32]") Then ToolTip($hWnd & " = " & $Title, 0, 0)
WEnd

Func
WindowFromPoint($XPoint, $YPoint)
Local $aResult = DllCall("User32.dll", "hwnd", "WindowFromPoint", "int", $XPoint, "int", $YPoint)
Return $aResult[0]
EndFunc

Func
Quit()
Exit
EndFunc
Автор: Tipulatoid
Дата сообщения: 01.11.2008 17:04
ViSiToR
Спасибо; мой диалап не открывает страницу с фиксом; думаю, завтра найду где скачать. Еще вопрос - можно ли в GUI-элемент "Edit" выводить иконки? Или только текст?
Автор: gal7
Дата сообщения: 01.11.2008 17:28

Цитата:
Всмысле узнать какое окно под курсором?

Нет, просто стоит ли сейчас там курсор или нет(в элементе Edit), извиняюсь за нечеткость. Проверить нужно это условие и если стоит, то туда перенесу текст из другого места, если нет, выдам сообщение (все это, после проверки, я уже знаю как сделать).
Автор: Maza Faka
Дата сообщения: 01.11.2008 17:39
ViSiToR

Цитата:
См. тут возможное решение проблеме (в основном там направляют на страницу с фиксом).

Не помог fix
Автор: Tipulatoid
Дата сообщения: 01.11.2008 17:41
Visitor
У меня все путем, заработало. Выяснилось, что файла RICHTX32.OCX в %windir%\system32 у меня вовсе не было.
Скачал, зарегистрировал, и все нормально. Big thanks.
Автор: Maza Faka
Дата сообщения: 01.11.2008 17:44
gal7
Дык ViSiToR для кого пример запостил? Переделай под свои нужды

Добавлено:
Tipulatoid

Цитата:
Скачал, зарегистрировал, и все нормально

Заработало! Спасибо!
Автор: gal7
Дата сообщения: 01.11.2008 18:21
??? Так там же ничего про курсор в Edit-е нет... Или я что-то не вижу
Автор: ViSiToR
Дата сообщения: 01.11.2008 22:26
Tipulatoid 11:30 01-11-2008
Цитата:
можно ли в поле "Edit" выводить иконки

Нет (хотя теоретический всё возможно ), но можно использовать ListBox, а там уже иконки можно подставить.

gal7 18:21 01-11-2008
Цитата:
там же ничего про курсор в Edit-е нет

Про Edit на момент написания примера ничего сказано небыло .
Это Edit от GUI аутоита, или внешнего приложения?
Автор: gal7
Дата сообщения: 02.11.2008 09:02

Цитата:
Это Edit от GUI аутоита, или внешнего приложения?

Автоитный Edit
Автор: Maza Faka
Дата сообщения: 02.11.2008 10:08
gal7
Пример №1:

Код: #include <GuiConstantsEx.au3>

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

$CtlEdit = GUICtrlCreateEdit("", 10, 10, 280, 180)

GUISetState()

While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case
$GUI_EVENT_MOUSEMOVE
If _OnHoverCheck(GUICtrlGetHandle($CtlEdit)) Then MsgBox(48, "Warning", "Cursor on hover!")
EndSwitch
WEnd

Func
_OnHoverCheck($hWnd)
Local $aPos = MouseGetPos()
Local $aResult = DllCall("User32.dll", "hwnd", "WindowFromPoint", "int", $aPos[0], "int", $aPos[1])
Return $aResult[0] = $hWnd
EndFunc
Автор: gal7
Дата сообщения: 02.11.2008 11:09
Мне нужно узнавать не про курсор мыши(стрелочку), который по экрану водится, а про курсор в элементе Edit (например, мигает который в блокноте там, где вводишь текст). Нужно определять виден ли он в данный момент в поле Edit.

Добавлено:
Ладно, сделаю тогда немного по-другому эту функцию, всем спасибо за помощь
Автор: ViSiToR
Дата сообщения: 02.11.2008 12:07
gal7 12:09 02-11-2008
Цитата:
например, мигает который в блокноте там, где вводишь текст

Вобщем нужно проверить сфокусирован ли элемент Edit?


Код: #include <GuiConstants.au3>

$hGUI = GUICreate("IsFocused Demo", 200, 200)

$CheckBox = GUICtrlCreateCheckbox("Checkbox", 10, 10)

$Edit = GUICtrlCreateEdit("", 10, 40, 180, 150)

GUISetState()

$IsFocused = 0

While 1
Switch GUIGetMsg()
Case -3
Exit
EndSwitch

If
_ControlIsFocused($hGUI, $CheckBox) And $IsFocused = 0 Then
$IsFocused = 1
MsgBox(64, "", "CheckBox Is Focused")
ElseIf _ControlIsFocused($hGUI, $Edit) And $IsFocused Then
$IsFocused = 0
MsgBox(64, "", "Edit Is Focused")
EndIf
Wend

Func
_ControlIsFocused($hWnd, $nCID)
Return ControlGetHandle($hWnd, '', $nCID) = ControlGetHandle($hWnd, '', ControlGetFocus($hWnd))
EndFunc
Автор: gal7
Дата сообщения: 02.11.2008 12:44

Цитата:
Вобщем нужно проверить сфокусирован ли элемент Edit?

Да, да, то что нужно. Спасибо! Я эту же функцию пробовал, но оказалось, что использовал ее неправильно, поэтому посчитал, что она работает не так и не подойдет.
Автор: Maza Faka
Дата сообщения: 02.11.2008 13:29
gal7
Правильно заданный вопрос - 50% ответа!

Код: #include <GuiConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>

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

$CtlEdit = GUICtrlCreateEdit("", 10, 10, 280, 150)

$OkButton = GUICtrlCreateButton("Ok", 11, 169, 75, 23)

$CloseButton = GUICtrlCreateButton("Close", 215, 169, 75, 23)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState()

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

Func
WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $iIDFrom = BitAND($wParam, 0x0000FFFF)
Local $iCode = BitShift($wParam, 16)

Switch $iIDFrom
Case $CtlEdit
Switch $iCode
Case $EN_SETFOCUS
ConsoleWrite("Focus set" & @LF)
Case $EN_KILLFOCUS
ConsoleWrite("Focus unset" & @LF)
EndSwitch
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc
Автор: gal7
Дата сообщения: 02.11.2008 13:49

Цитата:
Правильно заданный вопрос - 50% ответа!

Еще раз извиняюсь. Просто я долго искал ответ, устал и казалось кроме курсора в Edit вообще никаких курсоров больше нет

Добавлено:
А есть ли какой-нибудь стиль, функция и т.п., чтобы в элементе combobox, если его открыть и там имеются очень длинные строки, которые не вмещаются в строке, были видны полностью в всплывающей рамке(как например есть такая же в часах виндовс-если навести на них курсор, то появится дата)? Ато у меня вся строка не вмещается в маленьком окошке combobox, что очень не удобно.
Автор: gal7
Дата сообщения: 02.11.2008 20:26
И еще маленький вопросик, можно ли в этом выражении:
$e = StringRegExpReplace("127374", "[^374]+", "", 1)
(нужно - в итоге после замены должно получиться "374" - заменить все, кроме группы "374")
Сделать так, чтобы находил и заменял всю группу "374", а не любой символ из "374". Думал сработает в скобках(т.е.:"[^(374)]+", "[^(?i374)]+" и т.д.), но так не работает. Или так нельзя?
Автор: Leagnus
Дата сообщения: 02.11.2008 21:02

Код: $e = StringRegExpReplace("127374", "\d{3}(\d{3})", "\1", 1)
msgbox(0, "", $e)
Автор: gal7
Дата сообщения: 02.11.2008 21:16
Спасибо, буду разбираться.

Добавлено:
Нет, так не подойдет... Нужно именно с "все, кроме того-то".
Автор: ViSiToR
Дата сообщения: 02.11.2008 22:37
gal7 21:26 02-11-2008
Цитата:
в итоге после замены должно получиться "374" - заменить все, кроме группы "374"

Нужно использовать не квадратные скобки, а круглые:


Код:
$s374 = StringRegExpReplace("127374", "^.*(374).*", "\1")
MsgBox(0, "", $s374)
Автор: Tipulatoid
Дата сообщения: 03.11.2008 04:16
Возвращаясь к теме вывода лога на экран. На офф. форуме обнаружилась GuiRichEdit.au3 UDF С ней задача сводится к следующему простому коду:

guirichtest.au3 :
Код: #Include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiRichEdit.au3>


$MainColor = 0x00FF00
; зеленый
$FailureColor = 0x0000FF ; красный
$SuccessColor = 0xFFBA00 ; голубой
$BackgroundColor = 0x000000 ; черный
$TABS = @TAB & @TAB & @TAB & @TAB & @TAB & @TAB & @TAB

$GUI = GUICreate("Лог",700,500)
$hRichText =
RichText_Create($GUI, 0, 0, 700, 500)
RichText_BkColor ($hRichText, $BackgroundColor)

GUISetState()
_Archive_Process()

While 1
If
GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
WEnd



Func
_Archive_Process ()
For $q = 1 to 150
RichText_SetColor($hRichText, $MainColor)
RichText_SetFont($hRichText, "Tahoma")
RichText_SetFontSize ($hRichText, 14)
RichText_AppendText($hRichText, $q & " Архивирую Dreamers.avi" & $TABS)
RichText_SetBold($hRichText, True)
If Mod ($q, 2) = 0 Then
RichText_SetColor($hRichText, $SuccessColor)
RichText_AppendText($hRichText, "Успешно!" & @CRLF)
Else
RichText_SetColor($hRichText, $FailureColor)
RichText_AppendText($hRichText, "Ошибка!" & @CRLF)
EndIf
Sleep (20)
Next
EndFunc
;==> _Archive_Process
Автор: Maza Faka
Дата сообщения: 03.11.2008 06:22
Tipulatoid

Цитата:
запретить любое действие мыши и клавиатуры в окне лога?

MouseSetOnEvent_UDF
Low level hook

Добавлено:
gal7

Цитата:
в элементе combobox, если его открыть и там имеются очень длинные строки, которые не вмещаются в строке, были видны полностью в всплывающей рамке

Быстрый и грубый пример:

Код: #include <GuiConstantsEx.au3>
#include <ComboConstants.au3>
#include <WindowsConstants.au3>

Global $sRead

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

$CtlCombo = GUICtrlCreateCombo("Long Long Long Long Long Item 1", 50, 30, 100, 20)
GUICtrlSetData(-1, "Long Long Long Long Long Item 2|Long Long Long Long Long Item 3")

$OkButton = GUICtrlCreateButton("Ok", 11, 169, 75, 23)

$CloseButton = GUICtrlCreateButton("Close", 215, 169, 75, 23)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState()

While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case
$OkButton
MsgBox(0, "", GUICtrlRead($CtlCombo))
EndSwitch

If
(GUICtrlSendMsg($CtlCombo, $CB_GETDROPPEDSTATE, 0, 0) = 1) And (GUICtrlRead($CtlCombo) <> $sRead) Then
$sRead = GUICtrlRead($CtlCombo)
$aPos = WinGetPos(GUICtrlGetHandle($CtlCombo))
$iY = (GUICtrlSendMsg($CtlCombo, $CB_GETCURSEL, 0, 0) + 1) * 15 + 3
ToolTip($sRead, $aPos[0], ($aPos[1] + $iY))
EndIf
WEnd

Func
WM_COMMAND($hWnd, $msg, $wParam, $lParam)
Local $iIDFrom = BitAND($wParam, 0x0000FFFF)
Local $iCode = BitShift($wParam, 16)

Switch $iIDFrom
Case $CtlCombo
Switch $iCode
Case $CBN_CLOSEUP
ToolTip("")
EndSwitch
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Автор: Hackproof
Дата сообщения: 03.11.2008 08:34
Есть контрол ListView, в который пишется текст с разделителями. По мере добавления новой строки я делаю так, потому что GuiCtrlSetData не помогает:

Код: GUICtrlDelete($list)
$list = GUICtrlCreateListView (Всё предыдущее плюс новая строка)
Автор: gal7
Дата сообщения: 03.11.2008 10:08

Цитата:
Хотя в результате получается заранее известная цифра, тогда какая цель у подобной замены?

Я хотел понять принцип замены (поиска) всего кроме определённой группы символов. Мне это нужно для поиска в тексте определённого фрагмента, у которого известны начало и конец, а середина неизвестна. По идее должно было работать так: ищется известное начало, затем все кроме известного окончания и далее идет окончание-заменяю это все на пустое место. Чтобы не писать лишнего , что мне известно как сделать, я привел пример только на "поиск всего кроме указанной группы".


Цитата:
Быстрый и грубый пример:

Замечательно, спасибо огромное!
Автор: frb noname
Дата сообщения: 03.11.2008 14:20
Народ, подскажите пожалуйста как в автоите реализовать переход по элементам управления (в частности по полям "input") по нажатию клавиши Энтер.
Последовательность перехода как я понял из форума зависит от очередности создания контрола. Можно ли эту последовательность изменить произвольно ?
Автор: timsky
Дата сообщения: 03.11.2008 20:19
Есть такая программа.

Код: $login = IniRead(@ScriptDir & '\config.ini', 'Main', 'Login', '')
If $login = '' Then $login = 'login'

$pass = IniRead(@ScriptDir & '\config.ini', 'Main', 'Pass', '')
If $pass = '' Then $pass = 'password'

$type = @ScriptName

Select
Case
$type = 'Login.exe'
$run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\log.exe ' & $CmdLineRaw, @ScriptDir)
While @error
MsgBox(16, 'Error #' & @error, 'Error starting log.exe. Trying again...', 1)
$run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\log.exe ' & $CmdLineRaw, @ScriptDir)
WEnd

Case
$type = 'Confirm.exe'
$run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\conf.exe ' & $CmdLineRaw, @ScriptDir)
While @error
MsgBox(16, 'Error #' & @error, 'Error starting conf.exe. Trying again...', 1)
$run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\conf.exe ' & $CmdLineRaw, @ScriptDir)
WEnd

Case
$type = 'err.exe'
$run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\Error.exe ' & $CmdLineRaw, @ScriptDir)
While @error
MsgBox(16, 'Error #' & @error, 'Error starting Error.exe. Trying again...', 1)
$run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\Error.exe ' & $CmdLineRaw, @ScriptDir)
WEnd

Case Else


MsgBox(16, 'Error', 'Incorrect EXE name')
EndSelect

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

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


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