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

» AutoIT

Автор: Maza_Faka
Дата сообщения: 19.12.2008 09:41
Nikkorot

Цитата:
Нет, handle при каждом перезапуске программы получается разный. а вот ID,который в AutoIt Info на вкладке control также и обозначается как ID, постоянный.

AFAIK, ID есть только у контролов, у окон только handle. А что мешает идентифицировать окна по заголовку и тексту?

Добавлено:
babaytugur

Цитата:
как получить путь до файла по имени просесса?

В шапке есть пример
Автор: Nikkorot
Дата сообщения: 19.12.2008 11:43
Maza_Faka
Все правильно,это я ошибся, есть только у контролов. По заголовку и тексту не всегда удобно, бывает текст повторяется, и почему-то не всегда отрабатывает по тексту.
Автор: Loopback
Дата сообщения: 19.12.2008 13:26

Цитата:
Все правильно,это я ошибся, есть только у контролов. По заголовку и тексту не всегда удобно, бывает текст повторяется, и почему-то не всегда отрабатывает по тексту.

У окна есть еще имя класса - это вещь постоянная и не зависит от заголовка и текста. По нему удобно отбирать окна одной определенной программы. Найти класс можно с помощью Au3info, а писк потом ведется по заголовку с помощью специальной конструкции "[CLASS:classname]".
Автор: gal7
Дата сообщения: 19.12.2008 17:01
Как можно получить при запуске скрипта с переданными из другой программы параметрами эти параметры и можно ли или они передаются только autoit.exe, а не скрипту?
ConsoleRead не помогает, она для другого случая?
Я очень плохо ориентируюсь в "коммадной строке", "консоли"...

Добавлено:
Все, нашел - $CmdLine[$n].

Добавлено:
Теперь вернуть значение не могу...
StdinWrite() только для дочерних процессов видимо работает(???). ConsoleWrite() тоже не работает. Даже если при запуске передаю Pid из родительской для скрипта программы и его подставляю через StdinWrite(), то не работает. Как вернуть значение в программу, которая запустила скрипт?
Автор: NORIO
Дата сообщения: 19.12.2008 20:51
Maza_Faka
Спасибо за код, он помог мне решить проблему.
Теперь всё работает как надо.
Автор: sproxy
Дата сообщения: 19.12.2008 21:42
Воот мне нравиться здесь все, море энтузиазма + позитив, все друг другу помогают и в итого все решается )) Спасибоо огромное всем за эту ветку! Особенно РуБордовым героям АвтоИт : Maza_Faka и ViSiToR !
Автор: NORIO
Дата сообщения: 19.12.2008 22:03
sproxy

Цитата:
Спасибоо огромное всем за эту ветку! Особенно РуБордовым героям АвтоИт : Maza_Faka и ViSiToR !

Присоединяюсь.
Автор: Maza_Faka
Дата сообщения: 20.12.2008 06:45
gal7

Цитата:
Теперь вернуть значение не могу

Ну ты же
Цитата:
нашел - $CmdLine[$n]


Пример:

Код: If $CmdLine[0] = 0 Then Exit

MsgBox(0, "CmdLineRaw", $CmdLineRaw)

For $i = 1 To $CmdLine[0]
MsgBox(0, "CmdLine", $CmdLine[$i])
Next
Автор: matanN
Дата сообщения: 20.12.2008 10:02

Цитата:
Maza_Faka
Клавиатура [?]
Клавиатура + мышь

Спасибо, но для меня представленные конструкции сложноваты, (там где-то еще идет блокировка отдельных нажатий), я не программист, да и мой опыт общения с AutoIt ограничивается прокликиванием установки под себя некоторых программ.
Возникла мысль - а можно ли из системы выдернуть значение которое использует скринсейвер, или планировщик для запуска задач "при простое"
Автор: gal7
Дата сообщения: 20.12.2008 11:06

Цитата:
Ну ты же
Цитата:
нашел - $CmdLine[$n]


Это для получения параметров, переданных из запускающей скрипт-Autoit, программы. А мне нужно после отработки этого скрипта Autoit вернуть данные в вызвавшую его программу. Еще пробовал так:
Run(@ComSpec & " /c " & ' param', "", @SW_HIDE)
Тоже не работает...
В справке про "ConsoleWrite" написано:
This does not write to a DOS console unless the script is compiled as a console application..
Может из-за этого не получается, непонятно.
Нужно ведь всего лишь записать в STDOUT, но как это сделать?
Автор: ViSiToR
Дата сообщения: 20.12.2008 11:33
gal7 12:06 20-12-2008
Цитата:
В справке про "ConsoleWrite" написано

Это не пишет во внешний поток, однако если наш скрипт запущен в режиме STDOUT_CHILD/STDERR_CHILD (и родительский процесс читает это), то вполне возможно вернуть данные через ConsoleWrite.


Цитата:
Нужно ведь всего лишь записать в STDOUT, но как это сделать?

Я вроде где то на оф. форуме видел решение, позволяющее получить указатель на Std поток и записать в него данные, если найду то дам знать.
Автор: NIKZZZZ
Дата сообщения: 20.12.2008 11:57
gal7

Цитата:
А мне нужно после отработки этого скрипта Autoit вернуть данные в вызвавшую его программу.

Вернуть данные можно из скрипта, скомпилированного с опцией "Create CUI instead of GUI EXE"
ConsoleWrite будет выводить данные в стандартный STDOUT.

"This does not write to a DOS console unless the script is compiled as a console application.." - эта проблема решена в последних версиях компилятора.
Автор: Maza_Faka
Дата сообщения: 20.12.2008 12:09
matanN

Цитата:
а можно ли из системы выдернуть значение которое использует скринсейвер, или планировщик для запуска задач "при простое"

_Timer_GetIdleTime
Автор: gal7
Дата сообщения: 20.12.2008 13:10

Цитата:
Вернуть данные можно из скрипта, скомпилированного с опцией "Create CUI instead of GUI EXE"
ConsoleWrite будет выводить данные в стандартный STDOUT.

Спасибо, NIKZZZZ, так работает как надо. Но лучше конечно было бы если можно было делать тоже с нескомпилированным скриптом, т.к. придется часто менять его содержимое, и каждый раз компилировать как-то не очень хочется.
Автор: Maza_Faka
Дата сообщения: 20.12.2008 15:50
gal7

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


Код: $iPID = Run(@ComSpec & ' /c dir /b "' & @ProgramFilesDir & '"', @SystemDir, @SW_HIDE, 2 + 4)
$sStdOut = ""
$sStdErrOut = ""

While 1
$sStdOut &= StdoutRead($iPID)
If @error Then ExitLoop
WEnd

While
1
$sStdErrOut = StderrRead($iPID)
If @error Then ExitLoop
WEnd


MsgBox(0, "StdOut", $sStdOut)
MsgBox(0, "StderrOut", $sStdErrOut)
Автор: gal7
Дата сообщения: 20.12.2008 17:06
Этот пример просто запускает программу и ждет пока она вернет значения? Мне-то нужно чтобы скрипт сам возвращал запустившей его программе текст, а не получал его. Или я что-то не понял?

Добавлено:
Еще вопросик за одно - сильно ли влияют на ЖД многократные перезаписи? Мне например нужно будет часто перезаписывать файлы на уровне сотен тысяч-до 10 млн раз(может больше?) один и тот же файл за несколько месяцев по моим оценкам - может ли это сказаться на жд или ничего страшного? От этого зависит как часто буду делать сохранение файлов. С другой стороны, если сделать редкое сохранение можно много потерять.
Автор: NIKZZZZ
Дата сообщения: 20.12.2008 22:56
gal7

Цитата:
каждый раз компилировать как-то не очень хочется.

Проблема решаема:
1. Создаем пустой файл Au3ConOut.au3
2. Компилируем с указанной опцией.
Запускаем script.au3 с помощью командной строки

Код: Au3ConOut.exe /AutoIt3ExecuteScript script.au3 [параметры]
Автор: ViSiToR
Дата сообщения: 20.12.2008 23:05
Забавно, но разработчики AutoIt'а всё же прислушались к просьбе (не первой от меня) поправить доки...

18:17 08-12-2008
Цитата:
нужно разработчикам намекнуть на обновление доков по этому поводу


Намекнул по поводу:

16:24 08-12-2008
Цитата:
Как в регулярных выражениях отделять обратную ссылку от цифры после неё


И в последней бетте это добавили .
Автор: NIKZZZZ
Дата сообщения: 20.12.2008 23:12

Цитата:
сильно ли влияют на ЖД многократные перезаписи?

Современные диски имеют срок службы порядка десятилетий в таком режиме. Режим не особо приятный, однако, скорее выбросишь морально устаревший винт, чем он подохнет.

Автор: gal7
Дата сообщения: 21.12.2008 10:37

Цитата:
script.au3 будет выводить данные в в стандартный STDOUT

Благодарю, буду пробовать

Цитата:
Современные диски имеют срок службы порядка десятилетий в таком режиме

Ясно, ато я когда-то натыкался, на информацию, что флешки имеют лимит в сотни тысяч перезаписей, а про жд не смог ничего найти, буду знать.
Автор: Maza_Faka
Дата сообщения: 21.12.2008 11:50
gal7

Цитата:
я когда-то натыкался, на информацию, что флешки имеют лимит в сотни тысяч перезаписей, а про жд не смог ничего найти

Извиняюсь за оффтопик, но приниципы работы HDD и Flash-drive в корне различны
Автор: skaziWow
Дата сообщения: 21.12.2008 12:30
Добрый день!
если не сложно дайте совет..
нужно работать с приложением remote командами, я делаю следующее:

TCPStartup()
TCPConnect("127.0.0.1", 2500)

программа сигнализирует у входящем подключении, а дальше ей необходима авторизация, тоесть послать пароль например "123", как это можно сделать?

Или думаю не заморачиваться, а сделать через cmd telnet, тогда хотелось бы знать какой командой можно вытащить текст из консоли cmd?
Автор: Maza_Faka
Дата сообщения: 21.12.2008 16:21
skaziWow

Цитата:
послать пароль например "123", как это можно сделать?

TCPSend пробовал?
Автор: skaziWow
Дата сообщения: 21.12.2008 18:05
Пробовал, программа молчит, авторизация не проходит..
Как правильно написать скрипт, чтобы получить данные что выдаёт telnet в cmd консоли?
Автор: U235
Дата сообщения: 21.12.2008 22:14
Вопрос такой:
Есть скрипт:

Код: Opt("GUIOnEventMode", 1)
GUICreate("Test", 180, 100, 60, 200)
$button = GUICtrlCreateButton("B1", 50, 50, 70, 20)
GUICtrlSetOnEvent($button, "test1")
$button2 = GUICtrlCreateButton("B2", 50, 80, 70, 20)
GUICtrlSetOnEvent($button2, "test2")
GUISetState()
While 1
        Sleep(100)
WEnd
Func test1()
    While 1
    .......
    Sleep(1000)
    WEnd
EndFunc    
Func test2()
    TrayTip ( "test", "test", 1 )
EndFunc    
Автор: NORIO
Дата сообщения: 21.12.2008 22:30
Я додумался только до этого.

Код: Opt("GUIOnEventMode", 1)
GUICreate("Test", 180, 100, 60, 200)
$button = GUICtrlCreateButton("B1", 50, 50, 70, 20)
GUICtrlSetOnEvent($button, "test1")
$button2 = GUICtrlCreateButton("B2", 50, 80, 70, 20)
GUICtrlSetOnEvent($button2, "test2")
GUISetState()

While 1
Sleep(100)
WEnd

Func
test1()

While 1
Opt("GUIOnEventMode", 0)
if $button2 == GUIGetMsg() Then
test2()
EndIf
Sleep(10)
WEnd
EndFunc

Func
test2()
TrayTip ( "test", "test", 1 )
Opt("GUIOnEventMode", 1)
EndFunc
Автор: ViSiToR
Дата сообщения: 22.12.2008 01:31
U235 23:14 21-12-2008
Цитата:
Можно ли сделать так, чтобы кнопка B2 (перехватывалось нажатие) работала, когда выполняется функция test1?


Можно, примерно так...


Код: #include <Timers.au3>

Global $aEvents_Data[1][2]
Global $hOnEvent_Timer = -1
Global $iEnd_Function = False

HotKeySet("{ESC}", "Quit")

Opt("GUIOnEventMode", 1)
$hGUI = GUICreate("Test", 180, 100, 60, 200)

$Button = GUICtrlCreateButton("B1", 50, 50, 70, 20)
GUICtrlSetOnEvent(-1, "Test1")

$Button2 = GUICtrlCreateButton("B2", 50, 80, 70, 20)
_GUICtrlSetOnEvent(-1, "Test2") ;Используем эту функцию на элементах, которые будут прерывать цикл при событии (при их вызове)

GUISetState(@SW_SHOW, $hGUI)

$hOnEvent_Timer = _Timer_SetTimer($hGUI, 100, "_Set_EndFunction_Proc")

While 1
Sleep(100)
WEnd

Func
Test1()
TrayTip("", "", 1) ;Чтобы определить начало функции

Local $iCount = 1 ;Для демонстрации

While 1
Sleep(100)
ConsoleWrite("Looping in process... " & $iCount & @CRLF)
$iCount += 1

If $iEnd_Function Then ExitLoop
WEnd
EndFunc

Func
Test2()
TrayTip("test", "test", 1)
EndFunc

Func
_Set_EndFunction_Proc($hWnd, $Msg, $iIDTimer, $dwTime)
Local $aCurInfo = GUIGetCursorInfo($hGUI)
If Not IsArray($aCurInfo) Then Return

_Timer_KillTimer($hGUI, $hOnEvent_Timer)

For $i = 1 To $aEvents_Data[0][0]
If $aCurInfo[2] = 1 And $aCurInfo[4] = $aEvents_Data[$i][0] Then
;While $aCurInfo[2] = 1
;$aCurInfo = GUIGetCursorInfo()
;If Not IsArray($aCurInfo) Then ExitLoop

;Sleep(1)
;WEnd

;$aCurInfo = GUIGetCursorInfo()
;If IsArray($aCurInfo) And $aCurInfo[4] = $aEvents_Data[$i][0] Then $iEnd_Function = True

$iEnd_Function = True

ExitLoop
EndIf
Next


$hOnEvent_Timer = _Timer_SetTimer($hGUI, 100, "_Set_EndFunction_Proc")
EndFunc

Func
_GUICtrlSetOnEvent($iCtrlID, $sFuncName)
Local $iEventSet, $iItem = 0
If $iCtrlID = -1 Then $iCtrlID = _GUIGetLastCtrlID()

For $i = 1 To $aEvents_Data[0][0]
If $aEvents_Data[$i][0] = $iCtrlID Then
$iItem = $i ;We are replacing previous settings
ExitLoop
EndIf
Next

If
$iItem = 0 Then ;Control has not been set before
$aEvents_Data[0][0] += 1
$iItem = $aEvents_Data[0][0]
ReDim $aEvents_Data[$iItem+1][2]
EndIf

GUICtrlSetOnEvent($iCtrlID, "_Ctrl_Events_Func")

$aEvents_Data[$iItem][0] = $iCtrlID ;the control ID
$aEvents_Data[$iItem][1] = $sFuncName ;the function to call

Return 1 ;Success
EndFunc

Func
_Ctrl_Events_Func()
For $i = 1 To $aEvents_Data[0][0]
If $aEvents_Data[$i][0] = @GUI_CtrlId Then
$iEnd_Function = False

Call($aEvents_Data[$i][1], @GUI_CtrlId)
If @error Then Call($aEvents_Data[$i][1])

ExitLoop
EndIf
Next
EndFunc

Func
_GUIGetLastCtrlID()
Local $aRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", GUICtrlGetHandle(-1))
Return $aRet[0]
EndFunc

Func
Quit()
_Timer_KillTimer($hGUI, $hOnEvent_Timer)

Exit
EndFunc
Автор: U235
Дата сообщения: 22.12.2008 06:13
NORIO

Цитата:
что то длительное и непрерываемое

К сожалению все так и есть, в цикле множество WinWait и длительность цикла ~ десятки сек. - минуты.. (Попросили приделать что-то типа GUI к скрипту автоматического сканирования через WIA)
ViSiToR
Попробую.
Спасибо!
Автор: Maza_Faka
Дата сообщения: 22.12.2008 06:22
skaziWow

Цитата:
получить данные что выдаёт telnet в cmd консоли?

Пример

Добавлено:
U235

Цитата:
чтобы кнопка B2 (перехватывалось нажатие) работала

Мой вариант (предусмотрено также закрытие окна скрипта)

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

Opt("GUIOnEventMode", 1)

$hGUI = GUICreate("Test", 180, 100)

$button = GUICtrlCreateButton("B1", 50, 50, 70, 20)
GUICtrlSetOnEvent($button, "test1")

$button2 = GUICtrlCreateButton("B2", 50, 80, 70, 20)

GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState()

While 1
Sleep(100)
WEnd

;Отслеживаем уведомление SC_CLOSE (пользователь закрыл окно)
Func WM_SYSCOMMAND($hWmd, $Msg, $wParam, $lParam)
If $wParam = $SC_CLOSE Then _Exit()

Return $GUI_RUNDEFMSG
EndFunc

;Отслеживаем уведомление от кнопки
Func WM_COMMAND($hWmd, $Msg, $wParam, $lParam)
Local $nID = BitAND($wParam, 0x0000FFFF)
Local $nCode = BitShift($wParam, 16)

Switch $nCode
Case $BN_CLICKED
Switch $nID
Case $button2
test2()
EndSwitch
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc

Func test1()
While 1
Sleep(100)
WEnd
EndFunc ;==>test1

Func test2()
TrayTip("test", "test", 1)
EndFunc ;==>test2

Func _Exit()
Exit
EndFunc
Автор: hunter19
Дата сообщения: 22.12.2008 12:22
Подскажите пожалуйста пример скрипта-клиента, который соединяется к sql-серверу по определённому адресу,порту,логину и паролю.

Например, как увидеть данные из базы даных test из таблицы climb, если подключиться к 127.0.0.1:3306, логин=root, пароль=без пароля?И надо ли что либо предварительно сделать, чтобы подключиться через скрипт к sql-серверу?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

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


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