Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как задать действие для кнопки (http://forum.oszone.net/showthread.php?t=130917)

DImaN! 04-02-2009 17:26 1029326

Как задать действие для кнопки
 
Добрый день. Есть небольшой вопрос по синтаксису AutoIT. Создал форму: несколько лэйблов, несколько текстбоксов и одна кнопка. КАждому элементу (текстбоксы и кнопка) присвоил имена переменных. Вопрос в следующем: как можно сделать так, чтобы при нажатии на кнопку открывалася процесс cmd.exe (нужна ли ryjgrt в этом случае вообще переменная) и как можно передать команде SEND для командной строки текст, вводимый в текстбоксах (указываю "SEND("some text" & $myvar)", а в командной строке прописывается только текст до переменной и ID самой переменной). Можно ли вообще передать командной строке текст из текстбоксов?
Заранее спасибо за помощь

P.S. С вызовом командной строки при нажатии на кнопку уже разобрался. Теперь помогите с обработкой текста в текстбоксах

266903582 04-02-2009 19:43 1029464

SEND(guictrlread($указатель_на_текстбокс) & $myvar)

D_Master 04-02-2009 22:26 1029611

Цитата:

Цитата DImaN!
как можно сделать так, чтобы при нажатии на кнопку открывалася процесс cmd.exe »

Я делаю так:
Код:

#include <GUIConstants.au3>

#Region ### START Koda GUI section ### Form=
Opt("GUIOnEventMode", 1) ; Подключаем режим OnEvent
$Form1 = GUICreate("Form1", 249, 113)
GUICtrlCreateInput("", 16, 16, 201, 21)
$Checkbox1 = GUICtrlCreateCheckbox("Чекбокс", 16, 48, 105, 17)
$Button1 = GUICtrlCreateButton("Кнопка", 16, 72, 73, 25, 0)
GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
GUICtrlSetOnEvent($Button1, "RunCMD")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
Sleep(100)
WEnd

Func RunCMD()
        Run("cmd.exe")
EndFunc

Func Close()
        Exit
EndFunc

Но, быть может, гуру подскажут другой, более простой способ.

Creat0R 04-02-2009 22:31 1029615

А зачем Send, можно запустить сразу команду:

Код:

Run(@ComSpec & ' /C Dir D:\ & Pause')
Для содержимого в GUI:

Код:

$sRead = GUICtrlRead($iCtrlID)
Run(@ComSpec & ' /C ' & $sRead)


DImaN! 05-02-2009 11:19 1030057

Огромное спасибо за помощь!
Еще один наводящий вопрос.. Можно ли как-то запустить от имени администратора коммандную строку под ОС Windows Vista?

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

Creat0R 05-02-2009 15:48 1030369

Цитата:

Цитата DImaN!
Можно ли как-то запустить от имени администратора коммандную строку под ОС Windows Vista? »

В начало скрипта нужно поместить #RequireAdmin, и/или запускать через RunAs().

Цитата:

Цитата DImaN!
Можно ли как-то сделать так, чтобы при нажатии на кнопку открытия командной строки (во время выполнения скрипта) все действия выполнялись только в командной строке и нельзя было перейти в другое прложение »

А вот это не совсем понятно, что значит «нельзя было перейти в другое прложение»? блокировать всё вокруг? что блокировать, ввод с клавиатуры, клики мышкой? Подробнее.

DImaN! 05-02-2009 15:55 1030378

Для того, чтобы было нагляднее: мне нужно создать скрипт, который будет автоматом при помощи командной строки отправлять сообщения. ВОт код моего скрипта:
Код:

#include <GUIConstants.au3>
#include <Date.au3>
#RequireAdmin

GUICreate("TelnetForm", 360, 490)
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)

GUICtrlCreateTabItem("")

GUICtrlCreateLabel("Программа для отправки писем при помощи Telnet", 50, 10)
GUICtrlCreateLabel("POP Сервер", 5, 50)
GUICtrlCreateLabel("Отправитель", 5, 80)
GUICtrlCreateLabel("Получатель", 5, 110)
GUICtrlCreateLabel("Тема письма", 5, 140)

$srv  = GUICtrlCreateInput ("", 105, 50, 250)
$from = GUICtrlCreateInput ("", 105, 80, 250)
$to  = GUICtrlCreateInput ("", 105, 110, 250)
$subj  = GUICtrlCreateInput ("", 105, 140, 250)

GUICtrlCreateLabel("Тело письма", 5, 190)
$body = GUICtrlCreateEdit("", 20, 230, 320, 210, $ES_AUTOVSCROLL+$WS_VSCROLL)

$button = GUICtrlCreateButton("Отправка сообщения", 105, 450)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $button
            ButtonClick()
    EndSwitch
WEnd

        Func ButtonClick()
                Run("cmd.exe")
                ProcessWait("cmd.exe")
                SEND("telnet")
                SEND("{ENTER}")
                Sleep(200)
                        $sRead = GUICtrlRead($srv)
                        SEND("o " & $sRead & " 25")
                Sleep(200)
                Send("{ENTER}")

                Sleep(3000)
                SEND("HELO W" & "{ENTER}")
                        $sRead2 = GUICtrlRead($from)
                        SEND("MAIL FROM: " & "<" & $sRead2 & ">" & "{ENTER}")
                Sleep(300)
                        $sRead3 = GUICtrlRead($to)
                        SEND("RCPT TO: " & "<" & $sRead3 & ">" & "{ENTER}")
                Sleep(300)
                        Send("DATA" & "{ENTER}")
                Sleep(300)
                        SEND("From: " & "<" & $sRead2 & ">" & "{ENTER}")
                        SEND("To: " & "<" & $sRead3 & ">" & "{ENTER}")
                       
                        $sRead5 = GUICtrlRead($subj)
                        SEND("Subject: " & $sRead5 & "{ENTER}")
                       
                        $sShortDayName = _DateDayOfWeek( @WDAY, 1 )
                        $sNewDate = _DateAdd( 'n',0, _NowCalc())

                        SEND("Date: "  & $sShortDayName & ", " & $sNewDate & " " & "{+}0200" & "{ENTER}")
                SEND("MIME-Version: 1.0" & "{ENTER}")
                SEND("Content-Language: ru")
                SEND("{ENTER}" & "{ENTER}")
                               
                        $sRead4 = GUICtrlRead($body)
                        SEND($sRead4 & "{ENTER}")
                SEND("{ENTER}")
                SEND(".")
                SEND("{ENTER}")
                Sleep(200)
                SEND("quit" & "{ENTER}")
                Sleep(700)
                SEND("{ENTER}" & "{ENTER}")
                Sleep(1000)
                SEND("quit" & "{ENTER}")
                Sleep(500)
                SEND("exit" & "{ENTER}")

        endFunc

В чем проблема: когда нажимаю на кнопку "отправить" поднимается командная строка. Но при вводе команды "telnet" открывается не стандартный телнет, а новая копия данной программы. В чем может быть причина? возможно я просто неправильно изложил пролему...

Creat0R 05-02-2009 16:13 1030410

Цитата:

Цитата DImaN!
при вводе команды "telnet" открывается не стандартный телнет, а новая копия данной программы »

Открывает в cmd.exe, если нужно отдельно то запускать нужно сразу telnet.exe.

Код:

Run("telnet.exe")
    ProcessWait("telnet.exe")

P.S
И вообще, все эти Send... это очень не надёжно, я бы делал всё через StdInWrite/Read и в скрытом положении, отображая данные в GUI (ведь как я понимаю, на то и был создан GUI для telnet :) ).

DImaN! 05-02-2009 16:17 1030415

Спасибо, возможно переделаю используя StdInWrite/Read, но на данном этапе, все равно, после того, как поменял cmd.exe на telnet.exe открывается не окно телнета, а вторая копия программы. В чем может быть причина?

Creat0R 05-02-2009 16:29 1030427

Цитата:

Цитата DImaN!
открывается не окно телнеа, а вторая копия программы »

Какой программы? у меня ничего не октрывается кроме telnet'а.

DImaN! 05-02-2009 16:39 1030440

А вот это очень странно. проверил на 4-х компьютерах. и только на 2-х из них все отработало правильно. На остальных при открытии комндной строки (вводится команда telnet) и выскакивает ошибка: "'telnet' is not recognized as an internal or external command, operable program or batch file". Может дело в системной переменной PATH? Хотя на тех машинах, на которых скриптотработал нормально системные переменные те же самые :(

Creat0R 05-02-2009 17:11 1030471

Цитата:

Цитата DImaN!
На остальных »

Это каких, возможно telnt не везде присутствует?

А если так:

Код:

                Run("cmd.exe")
                ProcessWait("cmd.exe")
                SEND(@WindowsDir & "\telnet.exe")
                SEND("{ENTER}")


DImaN! 05-02-2009 17:19 1030480

С Vista такой вариант не пройдет, т.к. самого файла %SYSTEMROOT%\telnet.exe не существует. он где-то в другом месте месте лежит, сразу не вспомню где.. если я в Vista вручную открываю cmd.exe и ввожу telnet, тогда командная строка сразу переходит в режим telnet. Может есть еще какой-то обходной путь? Но в случае с данным скриптом валится ошибка "'telnet' is not recognized as ..."

Vadikan 07-02-2009 03:36 1031824

DImaN!, Telnet нужно сначала включить в "Программы и компоненты"

DImaN! 09-02-2009 09:50 1033356

Vadikan, в том то и дело, что он включен и если я просто открываю командную строку и там ввожу telnet, то он нормально отрабатывает...
Creat0R, можете ли подсказать как реализовать подобный вариант без команды SEND (в скрытом режиме)?

Creat0R 09-02-2009 14:49 1033580

Цитата:

Цитата DImaN!
можете ли подсказать как реализовать подобный вариант без команды SEND »

Я уже показал как это сделать в 3-ем сообщении.

DImaN! 09-02-2009 15:00 1033597

я понимаю, но можете привести еще какой-нибудь маленький фрагмент кода, чтобы было немного понятнее...
чтобы, скажем, хотя бы получилось открытыь телнет и ввести одну любую команду (в скрытом режиме).
P.S. извените, что уже немного подмучал Вас, просто в руководстве по AutoIT не очень хорошо раскрыты некоторые вопросы :(

Creat0R 09-02-2009 15:27 1033619

DImaN!,
Цитата:

открытыь телнет и ввести одну любую команду (в скрытом режиме)
Примерно так:

Код:

#include <Constants.au3>

$iTelnet = Run(@SystemDir & "\telnet.exe", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)

; Пишем в поток
StdinWrite($iTelnet, "команда" & @CRLF)

; Пишем без второго параметра для закрытия потока
StdinWrite($iTelnet)


DImaN! 09-02-2009 15:43 1033637

т.е. все мои SENDы я могу заменить командой StdinWrite, но без таймаутов? или как-то иначе работает данная команда?

Creat0R 09-02-2009 15:51 1033644

Цитата:

Цитата DImaN!
все мои SENDы я могу заменить командой StdinWrite »

Пробуйте, я всего лишь привёл пример (не тестировал особо).

P.S
Данный вопрос уже выходит за пределы тематики этого топика.


Время: 15:30.

Время: 15:30.
© OSzone.net 2001-