Что нового

[Сеть, интернет] Разрыв соединения по WiFi

us_ov

Новичок
Сообщения
8
Репутация
0
Версия AutoIt: 3.3.8.1
Описание:
Нужно разорвать только беспроводное соединение WiFi. Отключение интерфейсов не помогает, соединение не разрывается, поэтому devcon и cnic не спасает. Обьяснить женщинам, как свойствами системы это делается НЕВОЗМОЖНО! Нужен скрипт – то есть ярлык или одна кнопочка.
Я понимаю, что нужно делать, но не знаю как, это в Autoit.
Опыт нулевой.
Сценарий "Клик по иконке в трее" – возможно (есть примеры), но я не понимаю как указать процесс по которому искать эту самую иконку.
А если по имени соединения, то как указать в скрипте все беспроводные соединения (на разных машинах имена соединений разные)?

Примечания:
ОС WinXP (SP3) RU
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
us_ov

http://autoit-script.ru/index.php/topic,11095.msg73336.html#msg73336

Вот на примере VPN соединения. Вам же думаю понадобится этот набор команд http://technet.microsoft.com/ru-ru/library/cc755301%28v=ws.10%29.aspx#bkmk_wlanConn
Мой пример:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListBoxConstants.au3>

#AutoIt3Wrapper_Run_Tidy=y

If IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = Default Then

	Global $aNetConnect
	Global $exititem
	Global $objShell = ObjCreate("Shell.Application")

	$CSIDL_NetworkConnections = 0x31
	$objNS = $objShell.Namespace($CSIDL_NetworkConnections)
	$CountNS = $objNS.Items.Count
	Dim $aNetCon[$CountNS][8]
	$n = 0

	$hGui = GUICreate("NetCon", 210, 160, -1, -1, $WS_OVERLAPPEDWINDOW) ; Создаёт окно в центре экрана
	$sList = GUICtrlCreateList("", 10, 10, 190, 100, $GUI_SS_DEFAULT_LIST + $LBS_NOINTEGRALHEIGHT)
	$batton = GUICtrlCreateButton("Сохранить", 45, 130, 120)

	For $objItem In $objNS.Items
		$aNetCon[$n][0] = $objItem
		GUICtrlSetData($sList, $aNetCon[$n][0] .Name)
	Next

	GUISetState(@SW_SHOW)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				Exit
			Case $batton
				IniWrite(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', GUICtrlRead($sList))
		EndSwitch
	WEnd

EndIf

If IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") <> Default Then
	$hsGui = GUICreate("ConDeCon", 210, 60, -1, -1, $WS_OVERLAPPEDWINDOW)
	$sBattonCon = GUICtrlCreateButton("Подключить", 10, 20, 80)
	$sBattonDeCon = GUICtrlCreateButton("Отключить", 120, 20, 80)

	GUISetState(@SW_SHOW)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				Exit
			Case $sBattonCon
				ShellExecute('rasdial.exe ', IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") & ' ***** *****', @SystemDir, 'open', @SW_HIDE)
			Case $sBattonDeCon
				ShellExecute('rasdial.exe ', IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") & ' /disconnect', @SystemDir, 'open', @SW_HIDE)
		EndSwitch
	WEnd
EndIf
При первом включении программа отобразит имена всех сетевых подключений. Выбрав одно подключение нажать кнопку сохранить. В директории скрипта сохранится ини файл с именем подключения. При последующих включениях программы (если содержимое interfaceName.ini файла не менять) будет отображаться окошко с кнопками - "Подключить" и "Отключить".
 
Автор
U

us_ov

Новичок
Сообщения
8
Репутация
0
Спасибо за совет. Но к сожалению команд Netsh WLAN в ХР не существует и поэтому, то что касается W7 не пригодится.


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

Перенёс скрипт на ХР.
Сразу отрабатывает вторая часть (с кнопками включить отключить).
Первая часть (создание ини не отрабатывает).
Установил AutoIT на W7 - таже картина :(
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
us_ov
WIFI-адаптеры одинаковые на всех компьютерах или разные?
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
us_ov
Предлагаю такой вариант:

Код:
; НАЧАЛО

 $KEY='HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}'

 $COUNTER=1

 While True
  $R=RegEnumKey($KEY,$COUNTER)
  If @error Then ExitLoop
  RegRead($KEY&'\'&$R,'radioEnable')
  If @error=0 Then
   ShellExecute('DEVCON.EXE','disable '&RegRead($KEY&'\'&$R,'ComponentId'),'','',@SW_HIDE)
  EndIf
  $COUNTER+=1
 WEnd

; КОНЕЦ


Проверить на нескольких компьютерах возможности нет, но мой WIFI-адаптер отключается без проблем...
 
Автор
U

us_ov

Новичок
Сообщения
8
Репутация
0
Проверил - не отрабатывает.
И на usb, и на pci адаптерах.


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

Только сейчас увидел, на чём основан скрипт!
Я уже писал, что выключение адаптеров не позволяет разорвать соединение. Оно так и остаётся висеть процессом на точке доступа больше 4 минут. К великому сожалению devcon не спасает.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
us_ov
Тогда объясните, почему мой WIFI-адаптер отключается и соединение разрывается?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
us_ov
К слову, иконку в трее можно кликнуть по наличию ключевого слова в подсказке этой иконки.

Как-то так, например:
Код:
#include <GuiToolBar.au3>

$hWnd = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[Class:ToolbarWindow32;Instance:1]')

For $i = 1 To _GUICtrlToolbar_ButtonCount($hWnd)
	$iCommandID = _GUICtrlToolbar_IndexToCommand($hWnd, $i)
	If StringInStr(_GUICtrlToolbar_GetButtonText($hWnd, $iCommandID), 'WLAN') Then ; по подстроке в тексте иконки
		$aRect = _GUICtrlToolbar_GetButtonRect($hWnd, $iCommandID)
		ControlClick($hWnd, '', '', 'left', 1, $aRect[0], $aRect[1])
		ExitLoop
	EndIf
Next

WinWait('Состояние WLAN', '', 10)
ControlClick('Состояние WLAN', '', '&Отключить')
WinClose('Состояние WLAN', '')
 
Автор
U

us_ov

Новичок
Сообщения
8
Репутация
0
Да и у меня адаптеры отключаются только соединение не разрывается, а висит больше 4 минут (точнее не засекал). А если проделать фишку с ярлыком в трее и сказать по правой клавише отключить, то всё происходт как надо. Но "печалька" в том, что на компах, с которыми нужен такой изврат, стоят разные адаптеры где pci, а где usb и соединения названы, как бог на душу положит... Ещё более печально, что с конфигурацией компов ничего не имею права изменить - такова селяви... Поэтому обращаюсь к Вам за помощью.


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

WSWR
Я так понял, что в скрипте надо вместо WLAN вписать название, а имею право использовать подстановочные знаки например* и внести Беспроводное*?
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
us_ov
Предлагаю способ определения имени беспроводного соединения:

Код:
; НАЧАЛО

 $KEY1='HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}'
 $KEY2='HKLM\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}'

 $COUNTER1=1

 While True
  $R1=RegEnumKey($KEY1,$COUNTER1)
  If @error Then ExitLoop
  RegRead($KEY1&'\'&$R1,'radioEnable')
  If @error=0 Then

   $COUNTER2=1

   While True
    $R2=RegEnumKey($KEY2,$COUNTER2)
    If @error Then ExitLoop
    If $R2=RegRead($KEY1&'\'&$R1,'NetCfgInstanceId') Then
     MsgBox(0,'',RegRead($KEY2&'\'&$R2&'\Connection','Name'))
    EndIf
    $COUNTER2+=1
   WEnd

  EndIf
  $COUNTER1+=1
 WEnd

; КОНЕЦ
 
Автор
U

us_ov

Новичок
Сообщения
8
Репутация
0
snoitaleR
Ну хорошо, а дальше?
Как эти две идеи объединить?
Моей ничтожной квалификации в AutoIT не хватает!
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
us_ov
Нет, в функции StringInStr нужно просто вписать подстроку в несколько символов.
Возможно, есть подстрока, которая встречается везде: "Скорость", "Уровень", "Мбит/с", "Состояние" и т.д.

Если возможно несколько вариантов, то можно заменить на:
Код:
If StringRegExp(_GUICtrlToolbar_GetButtonText($hWnd, $iCommandID), '(Скорость)|(Уровень)|(Мбит)|(Беспроводное)', 0) Then


В функции
Код:
StringRegExp
как раз можно использовать разные шаблоны, это регулярные выражения.


Код snoitaleR у меня почем-то ничего не показывает
 
Автор
U

us_ov

Новичок
Сообщения
8
Репутация
0
Ребята это ВЫ гуру и ВАМ должно быть виднее, а я об этом ещё судить не могу.


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

WSWR
Есть движение :laugh: - по твоему скрипту (оставил в строке Беспроводное) открылось окно как по левой кнопке на иконке в трее, но ничего не отключилось...
Может прописать правую кнопку и самый верхний пункт меню отключить????


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

Завтра посмотрю на остальных компах, чего в названиях соединений понаписано...
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Вот, исправленный вариант:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListBoxConstants.au3>

#AutoIt3Wrapper_Run_Tidy=y

Global $aNetConnect, $sList, $objNS, $aNetCon
Global $objShell = ObjCreate("Shell.Application")

Func _ONOFFConnect()
	For $i = 0 To UBound($aNetCon) - 1
		If IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = $aNetConnect[$i][0] .Name Then
			$aNetConnect[$i][3] .DoIt
		EndIf
	Next
EndFunc   ;==>_ONOFFConnect

Func _GetNetConn()

	Global $CSIDL_NetworkConnections = 0x31
	Global $objNS = $objShell.Namespace($CSIDL_NetworkConnections)
	Global $CountNS = $objNS.Items.Count
	;1 -Состояние (вкл\выкл) 2 - наличие Свойства 3 -объект вкл\выкл 4 - объект свойства 5 - controlID Вкл 6 - controlID Свойства 7- controlID menu
	Global $aNetCon[$CountNS][8]
	Global $n = 0

	For $objItem In $objNS.Items

		$aNetCon[$n][0] = $objItem

		For $objVerbs In $aNetCon[$n][0] .verbs
			If $objVerbs.Name = "Вкл&ючить" Or $objVerbs.Name = "&Включить" Or $objVerbs.Name = "Подкл&ючить" Or $objVerbs.Name = "&Подключить" Then
				$aNetCon[$n][1] = False
				$aNetCon[$n][3] = $objVerbs
			ElseIf $objVerbs.Name = "Отклю&чить" Or $objVerbs.Name = "&Отключить" Then
				$aNetCon[$n][1] = True
				$aNetCon[$n][3] = $objVerbs
			ElseIf $objVerbs.Name = "Сво&йства" Then
				$aNetCon[$n][2] = True
				$aNetCon[$n][4] = $objVerbs
			EndIf

		Next
		If $aNetCon[$n][2] <> True Then
			$aNetCon[$n][2] = True
		EndIf
		$n += 1

	Next
	$aNetConnect = $aNetCon

EndFunc   ;==>_GetNetConn


If IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = 'default' Then

	$hGui = GUICreate("NetCon", 210, 160, -1, -1, $WS_OVERLAPPEDWINDOW) ; Создаёт окно в центре экрана
	$sList = GUICtrlCreateList("", 10, 10, 190, 100, $GUI_SS_DEFAULT_LIST + $LBS_NOINTEGRALHEIGHT)
	$batton = GUICtrlCreateButton("Сохранить", 45, 130, 120)

	_GetNetConn()

	For $i = 0 To UBound($aNetConnect) - 1
		GUICtrlSetData($sList, $aNetCon[$i][0] .Name)
	Next

	GUISetState(@SW_SHOW)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				Exit
			Case $batton
				IniWrite(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', GUICtrlRead($sList))
		EndSwitch
	WEnd

EndIf

If IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") <> 'default' Then

	$hsGui = GUICreate("ConDeCon", 210, 60, -1, -1, $WS_OVERLAPPEDWINDOW)
	$sBattonCon = GUICtrlCreateButton("Подключить", 10, 20, 80)
	$sBattonDeCon = GUICtrlCreateButton("Отключить", 120, 20, 80)

	GUISetState(@SW_SHOW)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				Exit
			Case $sBattonCon, $sBattonDeCon
				_GetNetConn()
				_ONOFFConnect()
		EndSwitch
	WEnd
EndIf
Вот вариант без GUI при последующих запусках. Т.е. последующий запуск будет включать/выключать интерфейс.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListBoxConstants.au3>

#AutoIt3Wrapper_Run_Tidy=y

Global $aNetConnect, $sList, $objNS, $aNetCon
Global $objShell = ObjCreate("Shell.Application")

Func _ONOFFConnect()
	For $i = 0 To UBound($aNetCon) - 1
		If IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = $aNetConnect[$i][0] .Name Then
			$aNetConnect[$i][3] .DoIt
		EndIf
	Next
EndFunc   ;==>_ONOFFConnect

Func _GetNetConn()

	Global $CSIDL_NetworkConnections = 0x31
	Global $objNS = $objShell.Namespace($CSIDL_NetworkConnections)
	Global $CountNS = $objNS.Items.Count
	Global $aNetCon[$CountNS][8]
	Global $n = 0

	For $objItem In $objNS.Items

		$aNetCon[$n][0] = $objItem

		For $objVerbs In $aNetCon[$n][0] .verbs
			If $objVerbs.Name = "Вкл&ючить" Or $objVerbs.Name = "&Включить" Or $objVerbs.Name = "Подкл&ючить" Or $objVerbs.Name = "&Подключить" Then
				$aNetCon[$n][1] = False
				$aNetCon[$n][3] = $objVerbs
			ElseIf $objVerbs.Name = "Отклю&чить" Or $objVerbs.Name = "&Отключить" Then
				$aNetCon[$n][1] = True
				$aNetCon[$n][3] = $objVerbs
			ElseIf $objVerbs.Name = "Сво&йства" Then
				$aNetCon[$n][2] = True
				$aNetCon[$n][4] = $objVerbs
			EndIf

		Next
		If $aNetCon[$n][2] <> True Then
			$aNetCon[$n][2] = True
		EndIf
		$n += 1

	Next
	$aNetConnect = $aNetCon

EndFunc   ;==>_GetNetConn


If IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = 'default' Then

	$hGui = GUICreate("NetCon", 210, 160, -1, -1, $WS_OVERLAPPEDWINDOW) ; Создаёт окно в центре экрана
	$sList = GUICtrlCreateList("", 10, 10, 190, 100, $GUI_SS_DEFAULT_LIST + $LBS_NOINTEGRALHEIGHT)
	$batton = GUICtrlCreateButton("Сохранить", 45, 130, 120)

	_GetNetConn()

	For $i = 0 To UBound($aNetConnect) - 1
		GUICtrlSetData($sList, $aNetCon[$i][0] .Name)
	Next

	GUISetState(@SW_SHOW)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				Exit
			Case $batton
				IniWrite(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', GUICtrlRead($sList))
		EndSwitch
	WEnd
Else
	_GetNetConn()
	Sleep(1000)
	_ONOFFConnect()
	Sleep(1000)
	Exit
EndIf
Вариант только отключения:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListBoxConstants.au3>
#include <Array.au3>

#AutoIt3Wrapper_Run_Tidy=y

Global $aNetConnect, $sList, $objNS, $aNetCon, $objVerbs
Global $objShell = ObjCreate("Shell.Application")

Func _ONOFFConnect()

	For $i = 0 To UBound($aNetCon) - 1
		If IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = $aNetConnect[$i][0] .Name Then
			$aNetConnect[$i][3] .DoIt
		EndIf
	Next

EndFunc   ;==>_ONOFFConnect

Func _GetNetConn()

	Global $CSIDL_NetworkConnections = 0x31
	Global $objNS = $objShell.Namespace($CSIDL_NetworkConnections)
	Global $CountNS = $objNS.Items.Count
	Global $aNetCon[$CountNS][8]
	Global $n = 0

	For $objItem In $objNS.Items

		$aNetCon[$n][0] = $objItem

		For $objVerbs In $aNetCon[$n][0] .verbs
			If $objVerbs.Name = "Вкл&ючить" Or $objVerbs.Name = "&Включить" Or $objVerbs.Name = "Подкл&ючить" Or $objVerbs.Name = "&Подключить" Then
				$aNetCon[$n][1] = False
				$aNetCon[$n][3] = $objVerbs
			ElseIf $objVerbs.Name = "Отклю&чить" Or $objVerbs.Name = "&Отключить" Then
				$aNetCon[$n][1] = True
				$aNetCon[$n][3] = $objVerbs
			ElseIf $objVerbs.Name = "Сво&йства" Then
				$aNetCon[$n][2] = True
				$aNetCon[$n][4] = $objVerbs
			EndIf

			If $objVerbs.Name = "Вкл&ючить" And IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = $aNetCon[$n][0] .Name Then Exit

			If $objVerbs.Name = "&Включить" And IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = $aNetCon[$n][0] .Name Then Exit

			If $objVerbs.Name = "Подкл&ючить" And IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = $aNetCon[$n][0] .Name Then Exit

			If $objVerbs.Name = "&Подключить" And IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = $aNetCon[$n][0] .Name Then Exit

		Next
		If $aNetCon[$n][2] <> True Then
			$aNetCon[$n][2] = True
		EndIf
		$n += 1

	Next
	$aNetConnect = $aNetCon

EndFunc   ;==>_GetNetConn


If IniRead(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', "default") = 'default' Then

	$hGui = GUICreate("NetCon", 210, 160, -1, -1, $WS_OVERLAPPEDWINDOW) ; Создаёт окно в центре экрана
	$sList = GUICtrlCreateList("", 10, 10, 190, 100, $GUI_SS_DEFAULT_LIST + $LBS_NOINTEGRALHEIGHT)
	$batton = GUICtrlCreateButton("Сохранить", 45, 130, 120)

	_GetNetConn()

	For $i = 0 To UBound($aNetConnect) - 1
		GUICtrlSetData($sList, $aNetCon[$i][0] .Name)
	Next

	GUISetState(@SW_SHOW)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				Exit
			Case $batton
				IniWrite(@ScriptDir & '\interfaceName.ini', 'InterfaceName', 'Name', GUICtrlRead($sList))
		EndSwitch
	WEnd
Else
	_GetNetConn()
	Sleep(1000)
	_ONOFFConnect()
	Sleep(1000)
	Exit
EndIf
 
Автор
U

us_ov

Новичок
Сообщения
8
Репутация
0
ivsatel
Всё замечательно.
Всё работает.
У меня ещё одна просьба.
Убери пожалуйста из скрипта функцию включения, это источник коллизий.
С женщинами за компьютером надо обращаться осторожно.
А то ведь включат когда надо выключить или наоборот.
Ещё раз ВСЕМ БОЛЬШОЕ СПАСИБО
 
Верх