Как автоматически переключать режим самолета в Windows
На моем ноутбуке я могу вручную переключить режим самолета, нажав FN + F12, я хочу сделать то же самое автоматически из проекта VB6 или VBA.
Я много раз искал и нашел ответы только на Включить/Отключить беспроводной адаптер или с помощью Sendkeys
для Windows 8:
Dim WSh As Object
Set WSh = CreateObject("Wscript.Shell")
WSh.Run "C:\WINDOWS\system32\rundll32.exe %SystemRoot%\system32\van.dll,RunVAN", , True
Sleep 200
WSh.SendKeys " "
Sleep 1000
WSh.SendKeys "{ESC}"
Но этот код не является надежным, и я не думаю, что он будет работать на Windows 7 или Windows 10.
Итак, мой вопрос: есть ли надежный способ автоматического переключения режима самолета в Windows.
Ответы
Ответ 1
У меня нет функционального ключа на моей клавиатуре, и это не проверено, а просто идея - почему бы вам не попробовать:
Sub SetMode()
CreateObject("Shell.Application").MinimizeAll
Application.SendKeys "{F12}" 'Try a way to refer the function key
End Sub
Еще одна возможная опция - это что-то вроде этого, в зависимости от вашей Windows:
Option Explicit
Public Sub TestMe()
Application.SendKeys ("^{ESC}")
Application.Wait Now + TimeValue("00:00:01")
SendKeys ("{s}")
SendKeys ("{e}")
SendKeys ("{t}")
SendKeys ("{t}")
SendKeys ("{i}")
SendKeys ("{n}")
SendKeys ("{g}")
SendKeys ("{s}")
SendKeys "~", False
Application.Wait Now + TimeValue("00:00:01")
SendKeys ("{a}")
SendKeys ("{i}")
SendKeys ("{r}")
Application.Wait Now + TimeValue("00:00:01")
SendKeys "~", False
Application.Wait Now + TimeValue("00:00:01")
SendKeys "~", False
End Sub
Знак ~
предназначен для ENTER, а ctrl+escape
имитирует клавишу windows
на клавиатуре. После того, как вы достигнете того, что хотите, вы можете перемещаться с помощью вкладок и стрелок.
Ответ 2
Решение 1: SendKeys
AFAIK клавиша Fn на клавиатуре не перехватывается Windows, это аппаратное сопоставление с функциональной клавишей, т.е. "Увеличить громкость".
Теперь проблема заключается в том, что клавиша "shutdown/enable wifi" посылает сигнал на оборудование для выключения карты.
Так что для SendKey нет виртуального ключа для "Wireless off/on" (хотя есть один для "volume up" ).
Решение 2. API Windows 8
Теперь другим подходом было бы использовать API Windows 8 здесь https://msdn.microsoft.com/en-us/library/windows/hardware/hh406627(v=vs.85).aspx и, более конкретно, следующие интерфейсы:
- IMediaRadioManager
- IRadioInstance
- IRadioInstanceCollection
- IMediaRadioManagerNotifySink
Это должно позволить вам получить радио для bluetooth, wifi,... а также "режим самолета", а затем выключить их, но я никогда не пытался использовать это с VBS.
Решение 3: Использование запросов WMI
Используя запросы WMI, вы можете в основном получить доступ к чему-либо на вашем компьютере, включая сетевые карты.
Класс, который вы ищете, это "Win32_NetworkAdapter", и все документы можно найти здесь: https://msdn.microsoft.com/en-us/library/aa394216(v=vs.85).aspx
Вот небольшой пример кода, в котором будут перечислены текущие сетевые адаптеры, вы можете настроить это, чтобы сохранить, какие из них были включены, прежде чем запускать script, чтобы снова включить их после.
' connects to the WMI server of the local machine
Set objConnection = GetObject("winmgmts:" _
& "{impersonationLevel=Delegate," _
& "authenticationLevel=PktPrivacy}!" _
& "\\localhost\root\cimv2")
' gets a list of all the network adapters in the system
Set objNetworkAdapters = objConnection.ExecQuery("SELECT * FROM Win32_NetworkAdapter")
' loops through all network adapters
For Each objCurrentNetworkAdapter in objNetworkAdapters
' objCurrentNetworkAdapter.Disable
' objCurrentNetworkAdapter.Enable
WScript.Echo objCurrentNetworkAdapter.Name
Next
Примечание:
В основном вы не должны получать доступ к "Самолетному режиму" из кода, так как это привилегия пользователя для этого, представьте, создает ли кто-то приложение, которое включает роуминг и соединение с данными, а затем начинает обновление, пока вы находитесь за границей...