Войти

Показать полную графическую версию : [решено] Как задать действие для кнопки


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

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

266903582
04-02-2009, 19:43
SEND(guictrlread($указатель_на_текстбокс) & $myvar)

D_Master
04-02-2009, 22:26
как можно сделать так, чтобы при нажатии на кнопку открывалася процесс 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
А зачем Send, можно запустить сразу команду:


Run(@ComSpec & ' /C Dir D:\ & Pause')

Для содержимого в GUI:

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

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

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

Creat0R
05-02-2009, 15:48
Можно ли как-то запустить от имени администратора коммандную строку под ОС Windows Vista? »
В начало скрипта нужно поместить #RequireAdmin, и/или запускать через RunAs().

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

DImaN!
05-02-2009, 15:55
Для того, чтобы было нагляднее: мне нужно создать скрипт, который будет автоматом при помощи командной строки отправлять сообщения. ВОт код моего скрипта:
#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
при вводе команды "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
Спасибо, возможно переделаю используя StdInWrite/Read, но на данном этапе, все равно, после того, как поменял cmd.exe на telnet.exe открывается не окно телнета, а вторая копия программы. В чем может быть причина?

Creat0R
05-02-2009, 16:29
открывается не окно телнеа, а вторая копия программы »
Какой программы? у меня ничего не октрывается кроме telnet'а.

DImaN!
05-02-2009, 16:39
А вот это очень странно. проверил на 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
На остальных »
Это каких, возможно telnt не везде присутствует?

А если так:

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

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

Vadikan
07-02-2009, 03:36
DImaN!, Telnet нужно сначала включить в "Программы и компоненты"

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

Creat0R
09-02-2009, 14:49
можете ли подсказать как реализовать подобный вариант без команды SEND »
Я уже показал как это сделать в 3-ем сообщении (http://forum.oszone.net/post-1029611-3.html).

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

Creat0R
09-02-2009, 15:27
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
т.е. все мои SENDы я могу заменить командой StdinWrite, но без таймаутов? или как-то иначе работает данная команда?

Creat0R
09-02-2009, 15:51
все мои SENDы я могу заменить командой StdinWrite »
Пробуйте, я всего лишь привёл пример (не тестировал особо).

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




© OSzone.net 2001-2012