Что нового

[Сеть, интернет] Определить активность сетевого подключения и его запуск при отсутствии

Автор
B

BOOKER

Новичок
Сообщения
33
Репутация
0
Ребята, спасибо за разъяснения. Всё больше и больше я начинаю врубаться и всё больше мне это начинает нравиться!

Апдейт1: Опять запутался...( Как запутаешься прям так хочется всё взять и бросить(((

Апдейт2: А можно в пример мне в этом скрипте вариант замены "ipconfig". Чтобы до конца понять)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
BOOKER [?]
Апдейт2: А можно в пример мне в этом скрипте вариант замены "ipconfig". Чтобы до конца понять)
Ниче не понял. Можешь яснее?
 
Автор
B

BOOKER

Новичок
Сообщения
33
Репутация
0
Ну вот пример еще привести с этим скриптом тоесть функцию переменной $pid поменять ну можно ли в этом скрипте "ipconfig" поменять на что нить другое и что бы оно также вывело просто меняя ipconfig и ничего больше?
 
Автор
B

BOOKER

Новичок
Сообщения
33
Репутация
0
Ладно бог с ним.Вроде с ipconfig разобрались какие действия следует предпринимать дальше?

З.Ы Если когданибудь эту штуку закончу сделаю из неё урок чтоб потом другим проще было)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
BOOKER
ipconfig - это утилита (маленькая программа), которую ты запускаешь посредством Run в AutoIt. То что она выдает в ответ скрипт собирает в некий контейнер (в скрипте это $line), и выдает ответ в MsgBox. Отсюда, должно быть понятно, что вместо ipconfig можно использовать любую другую утилиту (кроме telnet), которая выдает ответ в стандартный поток - ping, tracert, dir... ну ты понял.
 
Автор
B

BOOKER

Новичок
Сообщения
33
Репутация
0
Вот это лучшее объяснение которое мне поставило совсем всё на свои места! Так какой шаг предпринемаем далее?
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Может быть мой ответ будет не уместным, но очень хочу спросить...
Аффтар, можно тебя немного напрячь? И попросить выполнить этот скрипт, а то, что выведет - написать в спойлеры сюда (можешь просто запустить и потом Ctrl+V нажать), запусти при включенном VPN и выключенном:
Код:
$pid  = Run("ipconfig", "", @SW_HIDE, 0x2)
$line = ""
While 1
    $line &= StdoutRead($pid)
    If @error Then ExitLoop
Wend
$line &= @CRLF
$line &= @IPAddress1 & @CRLF & @IPAddress2 & @CRLF & @IPAddress3 & @CRLF & @IPAddress4
MsgBox(0, "STDOUT read:", $line)
ClipPut($line)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
BOOKER
1. анализ полученного ответа от ipconfig (а это, как ты помнишь, $line) на наличие твоего сетевого соединения. тут тебе поможет такая функция, как StringInStr
2. если нет нужной тебе строки, то подключай соединение через запуск rasdial через Run


Добавлено:
Сообщение автоматически объединено:

Nik_rus
не следишь за тредом, мы это уже прошли :blum:
http://autoit-script.ru/index.php?topic=2347.msg17098#msg17098
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Я хотел хочу посмотреть что выдаст @IPAddress*
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Nik_rus
не порть образовательный процесс ;D
да и тем более, опираться на @IPAddress, мне кажется не надежно. Они меняются местами. Особенно, если появляются/убираются какие-либо интерфейсы, особенно виртуальные.
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Я рассматривал такой вариант, что @IPAddress* может не хватить, но мне было интересно :blum:
 
Автор
B

BOOKER

Новичок
Сообщения
33
Репутация
0
Пока нефига не получается. При том что я понимаю что всё просто и уже почти вот оно)


Добавлено:
Сообщение автоматически объединено:

Провозился не получилось.Спросил ребят, помогли.
Вот что получилось:
Код:
If StringInStr($line, $FarLine) = 0 Then MsgBox(0, '', "Your connection isn't here")
If Not StringInStr($line, $FarLine)	Then Run("rasdial FarLine логин пасс")

Правда есть ещё вопросы но задам их завтра так как мозг опять загрузился))
 
Автор
B

BOOKER

Новичок
Сообщения
33
Репутация
0
Вот что получилось:

Код:
While 1

$pid  = Run("ipconfig", "", @SW_HIDE, 0x2)
$line = ""
$FarLine = "FarLine"
While 1
    $line &= StdoutRead($pid)
    If @error Then ExitLoop
Wend



If StringInStr($line, $FarLine) = 0 Then MsgBox(0, '', "Your connection isn't here")
If Not StringInStr($line, $FarLine)	Then Run("rasdial VPN Login Password")
WEnd


Если запустить скрипт при выключеном VPN то он сразу заподозрит неладное и включит его. А если запустить со включённым VPN и уже при работающем скрипте отрубить VPN то скрипт ничего делать не будет.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
BOOKER
Попробуй так
Код:
While 1

$pid  = Run("ipconfig", "", @SW_HIDE, 0x2)
$line = ""
$FarLine = "FarLine"
While 1
    $line &= StdoutRead($pid)
    If @error Then ExitLoop
Wend

If Not StringInStr($line, $FarLine) Then Run("rasdial VPN Login Password")
Sleep(10000)
WEnd

Скрипт каждые 10 сек будет делать Ipconfig, если подключение нет в списке, запустит rasdial.
 
Автор
B

BOOKER

Новичок
Сообщения
33
Репутация
0
Ура работает как нужно.Теперь я хочу сделать простецкий GUI. Чтобы было окошко Там 3 кнопочки запустить остановить и выйти и его можно было свернуть в трей. GUI я сделаю в KoDa а куда потом код вставлять я хз. Ещё вопрос про HotKeySet. Я хочу чтобы при нажатии кнопки ESC скрипт закрывался
Код:
HotKeySet("{ESC}", "?")
какую команду вместо вопроса поставить?
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Лови :smile:
Код:
#include <GUIConstantsEx.au3>
AutoItSetOption("TrayAutoPause",0)
$tstartpause = TrayCreateItem("Pause")
$tshowhide = TrayCreateItem("Show")
$texit = TrayCreateItem("Exit")
$window = GUICreate("VPN Checker",180,50)
$startpause = GUICtrlCreateButton("Pause",10,10,80,30)
$exit = GUICtrlCreateButton("Exit",100,10,80,30)
$show=False
$paused=False
_WinChange()
Dim $hotkeys[1][2] = [["{ESC}",$exit]]
GUISetAccelerators($hotkeys,$window)
While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			_terminate()
		Case $exit
			_terminate()
		Case $startpause
			_SwitchActive()
		Case $GUI_EVENT_MINIMIZE
			_WinChange()
	EndSwitch
	$msg2 = TrayGetMsg()
	Switch $msg2
		Case $texit
			_terminate()
		Case $tstartpause
			_SwitchActive()
		Case $tshowhide
			_WinChange()
	EndSwitch
	If $paused=False Then
		$pid  = Run("ipconfig", "", @SW_HIDE, 0x2)
		$line = ""
		$FarLine = "FarLine"
		While 1
		    $line &= StdoutRead($pid)
		    If @error Then ExitLoop
		Wend
		If Not StringInStr($line, $FarLine) Then
			RunWait("rasdial VPN Login Password")
		EndIf
	EndIf
WEnd
Func _terminate()
	GUIDelete($window)
	Exit
EndFunc
Func _WinChange()
	If $show=False Then
		$show=True
		GUISetState(@SW_SHOW,$window)
		GUISetState(@SW_RESTORE,$window)
		TrayItemSetText($tshowhide,"Hide")
	Else
		$show=False
		GUISetState(@SW_HIDE,$window)
		TrayItemSetText($tshowhide,"Show")
	EndIf
EndFunc
Func _SwitchActive()
	if $paused=True Then
		$paused=False
		GUICtrlSetData($startpause,"Pause")
		TrayItemSetText($tstartpause,"Pause")
	else
		$paused=True
		GUICtrlSetData($startpause,"Start")
		TrayItemSetText($tstartpause,"Start")
	EndIf
EndFunc

Собственно GUI, при минимайзе скрывается и управление через Tray.
Насчет HotKeySet - он ставится глобально, поэтому лучше ставить GUISetAccelerators
P.S.: а вообще чтобы по ESC выходить есть опция AutoIt "GUIExitOnEsc"
 
Автор
B

BOOKER

Новичок
Сообщения
33
Репутация
0
Спасибо но код специально не смотрю. Жду установок от моего сенсейя)
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
OffTopic:
А я учил аит так - брал большой проект и разбирал его по косточкам. А потом делал свой большой проект (я сделал AutoIt Based Post-Installation Wizzard). Но это не самый верный путь, возможно путь джедая :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
BOOKER
к сожалению, делать GUI - научить сложно. собственный опыт в этом деле куда полезнее.
азы можешь почитать в справке, в разделе GUI References.
если вкратце, то в AutoIt GUI рисуется посредством команды
Код:
GUICreate("Window title", $width, $height)

она создает пусто окно с заголовком Window title, шириной $width, высотой $height (они должны быть заранее определены, или вместо них могут стоять явно числа не превышающие ширину и высоту рабочего стола, для возможности полного отображения на мониторе). Он будет пуст и состоять лишь из заголовка и системных кнопок. Только его будет не видно. Чтобы его увидеть, нужно состояние окна, которое "скрытое" по умолчанию, перевести в режим "видимое".
Код:
$hMain = GUICreate("Window title", 200, 200)
GUISetState()

Только теперь, окно появится на мгновение и сразу же исчезнет. Почему? Потому что AutoIt - интерпретируемый язык сценариев. То есть он берет все команды прописанные в файле и начинает делать по порядку строку за строкой. А в этих двух строках написано -
1. Нарисуй окно с такими-то заголовком, шириной и высотой
2. Сделай его видимым
Он это сделал и вышел, т.к. других команд нет. Для того чтобы лицезреть это окно нужно заставить скрипт выполнять что-нибудь "другое" не очень навязчивое, и не мешающее просмотру нашего окна. Одним из таких способов - запустить после прорисовки "вечный" цикл.
Код:
$hMain = GUICreate("Window title", 200, 200)
GUISetState()

Do
Until False

Но! Это не эстетично. Потому что а) чтобы выйти из скрипта нужно "убить процесс" либо из трея, либо из диспетчера задач; б) цикл грузит ядро/процессор на 100%.
Для выхода из п. б) можно добавить паузу в цикле
Код:
$hMain = GUICreate("Window title", 200, 200)
GUISetState()

Do
	Sleep(10)
Until False

Для решения п. а) нужно все же почитать справку. Там в частности указано, что при нажатии на клавишу ESC или системную кнопку (X) - выход, генерируется сообщение $GUI_EVENT_CLOSE (можно использовать эту константу, подключив предварительно библиотеку GUIConstantsEx.au3) либо ее явное значение - -3 (Кстати говоря вставка в цикл функции GUIgetMsg() позволяет избавится от паузы, то есть одновременно решая и п.б) )
Сообщения регистрируются скриптом посредством команды
Код:
GUIGetMsg()

Поэтому простейший скрипт, рисования окна, не грузящий процессор и реагирующий на нажатия клавишы выхода будет выглядеть примерно следующим образом.
Код:
$hMain = GUICreate("Window title", 200, 200)
GUISetState()

Do
	$msg = GUIGetMsg()
Until $msg = -3

После этого почитай справку на тему контролов. Контролы - это дальнейшее развитие твоего окна, это его элементы. Кнопки, поля для ввода, чекбосы и радиокнопки, куски текста и прочее. Полный список в справке. При нажатии на контрол генерируется сообщение, равное внутреннему идентификатору этого контрола - "хендлу" (англ. Handle), которое ты можешь регулировать при помощи переменной, которой присваиваешь возвращаемое значение при создании того или иного контрола. К примеру, если создается кнопка командой
Код:
GUICtrlCreateButton("Push me", 50, 50)

то его хендл будет утерян, т.к. нет ссылки на него. Поэтому его нужно создать так
Код:
$hButton = GUICtrlCreateButton("Push me", 50, 50)

Теперь хендл созданной кнопки хранится в переменной $hButton. А проверка - сгенерировалось ли сообщение равное этому хендлу, а попросту говоря - нажалась ли кнопка с текстом "Push me" нужно просто проверить равенство
Код:
$msg = $hButton

и если нажалась, то выполнить какое-либо действие. Пусть этим действием будет вывод MsgBox(0, "I Win", "Hurray!"). Тогда код выше с одной кнопкой, выводящий это сообщение будет как указано ниже
Код:
$hMain = GUICreate("Window title", 200, 200)
$hButton = GUICtrlCreateButton("Push me", 50, 50)
GUISetState()

Do
	$msg = GUIGetMsg()
	If $msg = $hButton Then
		MsgBox(0, "I Win", "Hurray!")
	EndIf
Until $msg = -3

То есть все построение GUI сводится к грамотному оформлению операторов условия внутри вечного цикла. Нужно правильно организовать перехват сообщений при тех или иных событиях. Хочу еще отметить, что внутри цикла после нажатия на кнопку $hButton можно не только явно прописать какие-то действия типа MsgBox но и отдельные функции, определенные тобой в скрипте через
Код:
Func MyFunc($arg)
    ; Some actions
EndFunc
 
Автор
B

BOOKER

Новичок
Сообщения
33
Репутация
0
Вот что получается но явно какая то левая фигня знаю что явно не правильно поправьте плс.
Как его остановить потом. И как настроить кнопку выход? А то что бы не нажал оно выходит)

Код:
$hMain = GUICreate ("Internet Checker", 368, 203)
$hButton1 = GUICtrlCreateButton ("   &Запуск   ", 290, 20)
$hButton2 = GUICtrlCreateButton ("&Остановка", 290, 55)
$hButton3 = GUICtrlCreateButton ("    &Выход    ", 290, 90) 

GUISetState ()

Do
	$msg = GUIGetMsg ()
	If $msg = $hButton1 Then 
		 MsgBox (0, "Run", "Скрипт запущен")
		 While 1

$pid  = Run("ipconfig", "", @SW_HIDE, 0x2)
$line = ""
$FarLine = "FarLine"
While 1
    $line &= StdoutRead($pid)
    If @error Then ExitLoop
Wend

If Not StringInStr($line, $FarLine) Then Run("rasdial FarLine morgun 21532153")
Sleep(10000)
WEnd
 	EndIf
	If $msg = $hButton2 Then
		MsgBox (0, "Stop", "Скрипт остановлен")
	
	
	EndIf
	If $msg = $hButton3 Then
		MsgBox (1, "Exit", "Вы действительно хотите выйти"),
		$msg = -3
		EndIf
	Until $msg = -3
 
Верх