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

» AutoIT

Автор: ViSiToR
Дата сообщения: 21.09.2008 12:03
timsky 01:29 21-09-2008
Цитата:
Есть решение?

Если я правильно понял, _IEAttach всего лишь возвращает объект окна по заданному свойству (hWnd в нашем случае) ?
Тогда можно попробовать ещё так:


Код: #include <IE.au3>

$sUniqueTitle = "~ _____ My Title _____ ~"
$hwnd = WinGetHandle($sUniqueTitle)

$account = _IEAttach($hwnd, 'hwnd')

If @error Then
$hwnd = WinGetHandle("[CLASS:IEFrame;REGEXPTITLE:.*?" & $sUniqueTitle & ".*?]")
$account = _IEAttach($hwnd, 'hwnd')

If @error Then
$hwnd = ControlGetHandle("[CLASS:IEFrame; REGEXPTITLE:.*?" & $sUniqueTitle & ".*?]", "", "Internet Explorer_Server1")
$account = _IEAttach($hwnd, 'hwnd')
EndIf
EndIf

Select
Case
@error = 5
MsgBox (16,'Invalid Value', 'Can not access CL window!')
Case @error = 7
MsgBox (16,'No Match', 'Can not access CL window!' & @CRLF & "hwnd (Title) = " & WinGetTitle($hwnd))
EndSelect

MsgBox (64,'','OK?')
Автор: Tipulatoid
Дата сообщения: 21.09.2008 12:18
В - общем вот что получилось на чуть измененном ini (его новой вариант изменил в предыдущем посте)
Untitled58.au3 :
Код: #include <Array.au3>
$inifile = "champ.ini"

If FileExists ($inifile) Then
FileOpen ($inifile, 0)

$IniGeneral =
IniReadSection ($inifile, "General") ; записали общие настройки в 2-х мерный массив
;_ArrayDisplay ($IniGeneral, "Общие настройки")

$GroupQuan = IniRead($inifile, "General", "GroupQuan", "")
Dim $IniGroup[$GroupQuan+1][4]

For $g = 1 To $GroupQuan
$IniGroup
[$g][0] =
IniReadSection($inifile, "Group" & $g) ; записали настройки группы
;_ArrayDisplay ($IniGroup[$g][0], "Настройки группы" & $g)

$TeamQuan = IniRead ($inifile, "Group" & $g, "GroupTeamsQuan", "")
Dim $IniGroupTeamNames[1]
Dim $IniGroupTeamPasses[1]
Dim $IniGroupTeamEmails[1]

For $t = 1 To $TeamQuan
_ArrayAdd ($IniGroupTeamNames, IniRead ($inifile, "Group" & $g & "Teams", "Team" & $t & "Name", ""))
_ArrayAdd ($IniGroupTeamPasses, IniRead ($inifile, "Group" & $g & "Teams", "Team" & $t & "Pass", ""))
_ArrayAdd ($IniGroupTeamEmails, IniRead ($inifile, "Group" & $g & "Teams", "Team" & $t & "Email", ""))
Next
$IniGroup[$g][1] = $IniGroupTeamNames
; записали названия команд группы
;_ArrayDisplay ($IniGroup[$g][1], "Команды группы" & $g)
$IniGroup[$g][2] = $IniGroupTeamPasses ; записали пароли команд группы
;_ArrayDisplay ($IniGroup[$g][2], "Пароли группы" & $g)
$IniGroup[$g][3] = $IniGroupTeamEmails ; записали электронные адреса команд группы
;_ArrayDisplay ($IniGroup[$g][3], "Электронные адреса группы" & $g)
Next


FileClose ($inifile)
EndIf

_ArrayDisplay ($IniGeneral, "Общие настройки")
_ArrayDisplay ($IniGroup[1][0], "Настройки группы 1")
_ArrayDisplay ($IniGroup[1][1], "Имена команд группы 1")
_ArrayDisplay ($IniGroup[1][2], "Пароли группы 1")
_ArrayDisplay ($IniGroup[1][3], "Электронные адреса группы 1")
_ArrayDisplay ($IniGroup[2][0], "Настройки группы 2")
_ArrayDisplay ($IniGroup[2][1], "Имена команд группы 2")
_ArrayDisplay ($IniGroup[2][2], "Пароли группы 2")
_ArrayDisplay ($IniGroup[2][3], "Электронные адреса группы 2")
Автор: ViSiToR
Дата сообщения: 21.09.2008 12:38
Tipulatoid 13:18 21-09-2008
Цитата:
вот что получилось на чуть измененном ini

Ох.... усложняешь всё... пересмотри мой пример, там всё намного проще.


Цитата:
FileOpen ($inifile, 0)

Посмотри в справке как этим пользоваться, а для ini оно вообще не нужно


Цитата:
как, например вывести в консоль имя 3-ей команды из группы 2?

У тебя по два массива на каждом столбике, для извлечения каждого массива нужно создать временную(?) переменную, которая будет содержать извлечённый массив:


Код: $aTmpArr = $IniGroup[2][1] ;тут у нас вроде значение ключа «Team3Name=» в секции «Group2Teams»
ConsoleWrite($aTmpArr[3])
Автор: Tipulatoid
Дата сообщения: 21.09.2008 13:31
ViSiToR
Да, разобрался. Круто, как всегда
Автор: Hackproof
Дата сообщения: 21.09.2008 16:41
Очередная засада.
Программа периодически выполняет некоторые действия, и результат пишет в большой edit


Код: GuiCtrlSetData($log, StringFormat(@crlf & $logstring),1)
Автор: timsky
Дата сообщения: 21.09.2008 18:22

Цитата:
В справке (описание функции _IEAttach) . Кстати, одно из преимуществ SciT'а - ставим курсор на функции (или выделяем её, кому как удобно), нажимаем F1, и получаем справку открытую на том месте где эта функция описывается .

Ну все, уговорил! Пощупаю его
Я пробовал аатачить по хендлу, тайтлу, тайтлу окна - один хер. Попробую твой новый вариант сегодня, спасибо! Как-то даже и не замечал, что есть ControlGetHandle
Вот кстати, как я пытался приаттачиться вчера:

Цитата:
#include <IE.au3>
AutoitSetOption ('WinTitleMatchMode', 2)

$account2 = _IEAttach ('Internet Explorer', 'WindowTitle')
MsgBox (0,'Error: ', @error)

$account2 = _IEAttach ('Internet Explorer', 'WindowTitle', 1)
MsgBox (0,'Error: ', @error)

$account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:IEFrame]', 'Embedded')
MsgBox (0,'Error: ', @error)

$account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:IEFrame]', 'Embedded', 1)
MsgBox (0,'Error: ', @error)

$account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:IEFrame]')
MsgBox (0,'Error: ', @error)


$account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:Internet Explorer_Server; INSTANCE:1]')
MsgBox (0,'Error: ', @error)

$account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:Internet Explorer_Server]', 1)
MsgBox (0,'Error: ', @error)


$account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:Internet Explorer_Server1]')
MsgBox (0,'Error: ', @error)


$account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:Internet Explorer_Server; INSTANCE:1]', 'Embedded')
MsgBox (0,'Error: ', @error)

$account2 = _IEAttach ('[TITLE:Internet Explorer; CLASS:Internet Explorer_Server; INSTANCE:1]', 'Embedded', 1)
MsgBox (0,'Error: ', @error)


$account2 = _IEAttach ('', 'Instance', 1)
MsgBox (0,'Error: ', @error)


$hwnd = WinGetHandle ('Internet Explorer')
MsgBox (64,'Handle',$hwnd)

$account2 = _IEAttach ($hwnd, 'HWND')
MsgBox (0,'Error: ', @error)

$account2 = _IEAttach ($hwnd, 'HWND', 1)
MsgBox (0,'Error: ', @error)

Не аттачится - и все
Автор: ViSiToR
Дата сообщения: 21.09.2008 23:46
Hackproof 17:41 21-09-2008
Цитата:
поле надо бы как-то очищать, чтобы там например, хранились последние 100 строк

Т.е в Edit-поле убрать всё кроме последних 100 строк?

Вот так можно:


Код: #include <GuiConstantsEx.au3>

$GUI = GUICreate("<Last 100 in Edit> Demo", 300, 220)

$Edit = GUICtrlCreateEdit("", 20, 20, 260, 160)

For $i = 1 To 200
GUICtrlSetData($Edit, "Line Number " & $i & @CRLF, 1)
Next

$Clean_Button = GUICtrlCreateButton("Clean Edit", 20, 190, 80, 20)

GUISetState(@SW_SHOW, $GUI)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case
$Clean_Button
Local $iLimit_Lines = 100
Local $sNew_Edit_Data = ""
Local $aRead_Edit = StringSplit(StringStripWS(GUICtrlRead($Edit), 3), @LF)

If $aRead_Edit[0] > $iLimit_Lines Then
For
$i = $aRead_Edit[0] To 1 Step -1
$sNew_Edit_Data = $aRead_Edit[$i] & @CRLF & $sNew_Edit_Data

If $aRead_Edit[0]-$i = $iLimit_Lines-1 Then ExitLoop
Next

GUICtrlSetData($Edit, StringStripWS($sNew_Edit_Data, 3))
EndIf
EndSwitch
WEnd
Автор: Maza Faka
Дата сообщения: 22.09.2008 07:37
Hackproof

Цитата:
поле надо бы как-то очищать, чтобы там например, хранились последние 100 строк

Можно так:

Код: #include <GuiConstantsEx.au3>
#include <GuiEdit.au3>

$GUI = GUICreate("<Last 100 in Edit> Demo", 300, 220)

$Edit = GUICtrlCreateEdit("", 20, 20, 260, 160)

For $i = 1 To 100
GUICtrlSetData($Edit, "Line Number " & $i & @CRLF, 1)
Next

GUISetState(@SW_SHOW, $GUI)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch


$LineCount = _GUICtrlEdit_GetLineCount($Edit)
If $LineCount > 101 Then
$sText = ""
For $i = 1 To 100
$sText &= _GUICtrlEdit_GetLine($Edit, $i) & @CRLF
Next

GUICtrlSetData($Edit, "")
GUICtrlSetData($Edit, $sText, 1)
EndIf
WEnd
Автор: Hackproof
Дата сообщения: 22.09.2008 12:17
Замечательно, спасибо всем.
Автор: 4kusnik
Дата сообщения: 22.09.2008 14:27

Цитата:
Не вижу связи, почему после Send("!y") нужно указывать место сохранения и т.п.?
Возможно требуется просто вывести диалог сохранения файла?

Нет. Диалог сохранения файла уже выводится командой Send("!y"). Мне нужно в окне сохранения файла указать Имя файла и Путь сохранения файла. В некоторых случаях еще и тип файла (например JPEG или PNG).

Вот скрипт открытия Блокнота, ввода текста TEST, закрытия Блокнота, выбора сохранения файла.

Код: Run ("notepad.exe")
WinWaitActive ("Untitled - Notepad")
Send ("TEST")
WinClose ("Untitled - Notepad")
WinWaitActive ("Notepad", "The text in the Untitled file has changed")
Send ("!y")
Автор: Hackproof
Дата сообщения: 22.09.2008 15:47
На четырех разных программах, которые я проверил, курсор стоит уже на строке, где надо писать имя файла. Поэтому мне кажется, что просто send("c:\test.txt{ENTER}")

А насчет пути к программе, я вопрос не понял. Если надо в тексте программы иметь такой путь, то переменной - $install="c:\temp\install.exe", а потом run($install).
Автор: 4kusnik
Дата сообщения: 22.09.2008 15:57
Hackproof разобрался. Спасибо.

А как отключать галочки?


Автор: Hackproof
Дата сообщения: 22.09.2008 18:13
GUICtrlSetState($checkbox,$GUI_UNCHECKED) в своей программе.
В другой надо узнать идентификатор галочки. К примеру IrfanView при открытии файла галочка на предв. просмотр - ControlClick("Open","","[ID:1804]").
Я определяю ID программой Get&Set. В комплекте AutoIt тоже вроде было что-то похожее.
Автор: 4kusnik
Дата сообщения: 22.09.2008 19:28
Hackproof если не трудно объясни чуть подробнее и без макросов.

У меня вобщем в конце установки выходит окно в котором перед тем как нажать Finish нужно снять эту галочку (ту что на скрине).
Автор: Hackproof
Дата сообщения: 23.09.2008 01:00
Качаешь Get&Set, нажимаешь кнопку Hook, наводишь на галочку, нажимаешь пробел и вписываешь ID в десятичной системе в вышенаписанную строку, не забыв про заголовок окна, где эта галочка появляется.
Автор: Maza Faka
Дата сообщения: 23.09.2008 06:25
Hackproof

Цитата:
Качаешь Get&Set, нажимаешь кнопку Hook, наводишь на галочку

А чем не устраивает AutoIt Window Info? И качать ничего не надо
Автор: Tipulatoid
Дата сообщения: 23.09.2008 13:35
Ребят, вы можете подробно прокомментировать такой код (дали на офф. форуме). Интересуют те строки, что выделены жирным

Код: #include <GuiConstantsEx.au3>
#include <editconstants.au3>
#include <windowsconstants.au3>
$MainGui = GUICreate('test', 300, 150)
$Label1 = GUICtrlCreateLabel("E-mail", 5, 10, 40, 17)
$Input1 = GUICtrlCreateInput("sample@uknown.com", 50, 10, 150)
$Email = GUICtrlRead($Input1)
$SplitEmail = StringSplit($Email, "@")
$Label2 = GUICtrlCreateLabel("SMTP", 5, 40, 40, 17)
$Input2 = GUICtrlCreateInput("smtp." & $SplitEmail[2], 50, 40, 150)


GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND");only used for EN_CHANGE so far

While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit

EndSelect
WEnd



Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
Local $AtPos, $s1
$nNotifyCode = BitShift($iwParam, 16)
$nID = BitAND($iwParam, 0x0000FFFF)
$hCtrl = $ilParam

If $nNotifyCode = $EN_CHANGE Then
If $ilParam = GUICtrlGetHandle($Input1) Then
$s1 = GUICtrlRead($Input1)
$AtPos = StringInStr($s1, '@')
If $AtPos Then
GUICtrlSetData($Input2, "smpt." & StringRight($s1, StringLen($s1) - $AtPos))
EndIf
EndIf

EndIf

Return $GUI_RUNDEFMSG


EndFunc ;==>WM_COMMAND
Автор: Maza Faka
Дата сообщения: 23.09.2008 15:49
Tipulatoid

Цитата:
вы можете подробно прокомментировать такой код

Функция GUIRegisterMsg() регистрирует функции пользователя для определённых Windows-сообщений. После регистрации, функция вызывается системой. В твоём примере происходит регистрация функции для сообщения WM_COMMAND. Это сообщение обрабатывает уведомления поступившие от control-а Input, такие, как обновление текста, установка/потеря фокуса и т.д. В данном примере ты обрабатывешь уведомление $EN_CHANGE, которое поступает при обновлении текста в control-е Input. И всё это обрабатывается системой, что очень удобно. Константу $GUI_RUNDEFMSG нужно возвращать для того, что бы, как можно быстрее выйти из CallBack функции и продолжить работу скрипта.
Автор: Tipulatoid
Дата сообщения: 23.09.2008 16:12
Maza Faka
Cпасибо. Более-менее проясняется. А что содержится в параметрах ($hWnd, $imsg, $iwParam, $ilParam) ?
И что происходит здесь BitShift($iwParam, 16) и здесь BitAND($iwParam, 0x0000FFFF) В справке это есть, но я просто не понимаю, что такое "битовый сдвиг числа" и "побитовое логическое умножение"
Автор: Maza Faka
Дата сообщения: 23.09.2008 17:13
Tipulatoid

Цитата:
А что содержится в параметрах ($hWnd, $imsg, $iwParam, $ilParam) ?

$hWnd - Handle окна, в нашем случае handle главного окна.
$imsg - Сообщение, в нашем случае WM_COMMAND
$iwParam и $ilParam - параметры, содержимое которых зависит от сообщения. Для сообщения WM_COMMAND содержимое параметров будет таким:
$iwParam - Старшее слово BitShift($iwParam, 16) - код уведомления
$iwParam - Младшее слово BitAND($iwParam, 0x0000FFFF) - идентификатор контрола.
$ilParam - Handle контрола.

MSDN
Автор: Tipulatoid
Дата сообщения: 23.09.2008 18:10
Maza Faka
Да, в общих чертах ясно. Thanks
Автор: ViSiToR
Дата сообщения: 23.09.2008 22:07
Tipulatoid 14:35 23-09-2008
Цитата:
В этом коде что ты мне дал есть баг

Там есть много багов, я же написал что это только как пример, я не могу поправить этот скрипт, у тебя позже всплывут другие проблемы (с этим скриптом), это гарантированно. Там нужно просто каким-то способом проверять все инпуты, и соответственно выполнять действия (включение/отключение кнопок и т.д.).

Добавлено:
Maza Faka 16:49 23-09-2008
Цитата:
Функция GUIRegisterMsg() регистрирует функции пользователя....

Добавил это описание в шапку, пусть будет, думаю не раз ещё будут спрашивать
Автор: Tipulatoid
Дата сообщения: 24.09.2008 00:45
ViSiToR
Т.е. я правильно тебя понял, что проще переписать Мастер по типу второго предложенного тобой варианта, когда все элементы GUI рисуются в одном окне; ненужные на данном шаге скрываются. И кнопку "Далее" отключать по двум условиям - если такой-то инпут видим и если в нем ничего нет - отключить "Далее"; иначе - включить?
Автор: ViSiToR
Дата сообщения: 24.09.2008 01:48
Tipulatoid 01:45 24-09-2008
Цитата:
проще переписать Мастер по типу второго предложенного тобой варианта, когда все элементы GUI рисуются в одном окне

Да, заодно попрактикушь новые знания
Автор: Tipulatoid
Дата сообщения: 24.09.2008 04:19
Подскажите почему такая функция ничего не выводит в консоль
Код: Func _CheckIcons ()
If $iStep = 2 Then
     If GUICtrlGetState ($WIcon2_3_1) = $GUI_SHOW Then
         ConsoleWrite ("crestik viden")
     EndIf
EndIf
EndFunc
Автор: Maza Faka
Дата сообщения: 24.09.2008 06:46
ViSiToR

Цитата:
Добавил это описание в шапку, пусть будет, думаю не раз ещё будут спрашивать

Ага, спасибо. Кстати, в шапке это опечатка или я не так понял?

Цитата:

Отдельный функции (UDF):


Tipulatoid

Цитата:
Подскажите почему такая функция ничего не выводит в консоль

Проверяй так:

Код:
If BitAND(GUICtrlGetState($WIcon2_3_1), $GUI_SHOW) Then ...
Автор: Tipulatoid
Дата сообщения: 24.09.2008 12:34
Maza Faka

Цитата:
If BitAND(GUICtrlGetState($WIcon2_3_1), $GUI_SHOW) Then ...
Работает!
Приведите плиз пример простенького GUI с одним CheckBox - ом чтобы при выделении его в консоль выводилось "Checkbox checked", при снятии - "Checkbox unchecked" Необходимо знать какие сообщения и уведомления здесь применимы.
Автор: ViSiToR
Дата сообщения: 24.09.2008 14:11
Maza Faka 07:46 24-09-2008
Цитата:
в шапке это опечатка

Да, это я в начале что-то другое хотел написать - Поправил, спасибо.

Tipulatoid 13:34 24-09-2008
Цитата:
пример простенького GUI с одним CheckBox - ом чтобы при выделении его в консоль выводилось "Checkbox checked", при снятии - "Checkbox unchecked"

Вот:


Код: #include <GuiConstants.au3>

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

$Checkbox = GUICtrlCreateCheckbox("Checkbox", 20, 40)

GUISetState(@SW_SHOW, $GUI)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case
$Checkbox
If BitAND(GUICtrlRead($Checkbox), $GUI_CHECKED) Then
ConsoleWrite("Checkbox checked" & @LF)
Else
ConsoleWrite("Checkbox unchecked" & @LF)
EndIf
EndSwitch
WEnd
Автор: gal7
Дата сообщения: 24.09.2008 15:04
Ребят, а как вы в автоите пишете регулярное выражение, когда надо учесть начало (или конец) всего выражения для поиска в нем? Я придумал для этого только использование условий. Для начала: "(?<!.)рег. выр." , для конца: "рег. выр.(?!.)" - т.е. нету никакого символа до/после. А как нужно "по-настоящему"? Ато вдруг когда-то такое не сработает (точка вроде не совсем все обозначает).
Автор: ViSiToR
Дата сообщения: 24.09.2008 17:00
gal7 16:04 24-09-2008
Цитата:
надо учесть начало (или конец) всего выражения для поиска в нем

Есть «\A» для начала строки, и «\z» для конца. Для конца ещё используется «$», но если в начале использовать (?m) то это обозначает новую строку в стринге.

P.S
В справке оно всё есть Также в шапке есть ссылки на ресурсы по регулярным выражениям.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

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


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