Vba 如何在Windows上自动切换飞机模式

Vba 如何在Windows上自动切换飞机模式,vba,vbscript,cmd,automation,vb6,Vba,Vbscript,Cmd,Automation,Vb6,在我的笔记本电脑上,我可以通过按FN+F12手动切换飞行模式,我想从VB6项目或VBA自动执行相同的操作 我做了大量搜索,只找到了有关启用/禁用无线适配器或使用Windows 8的Sendkeys的答案: Dim WSh As Object Set WSh = CreateObject("Wscript.Shell") WSh.Run "C:\WINDOWS\system32\rundll32.exe %SystemRoot%\system32\van.dll,RunVAN", , True S

在我的笔记本电脑上,我可以通过按FN+F12手动切换飞行模式,我想从VB6项目或VBA自动执行相同的操作

我做了大量搜索,只找到了有关启用/禁用无线适配器或使用Windows 8的
Sendkeys
的答案:

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}"
但这段代码不可靠,我认为它在Windows7或Windows10上不起作用


所以我的问题是:有没有可靠的方法可以在Windows上自动切换飞行模式。

我的键盘上没有功能键,这也没有经过测试,但只是一个想法-你为什么不这样试试:

Sub SetMode()

    CreateObject("Shell.Application").MinimizeAll        
    Application.SendKeys "{F12}"  'Try a way to refer the function key

End Sub
另一个可能的选项如下所示,具体取决于您的窗口:

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

~
符号表示回车,而
ctrl+escape
模拟键盘上的
windows
键。到达所需位置后,您可以使用选项卡和箭头导航。

解决方案1:SendKeys

如果键盘上的Fn键没有被Windows截获,它是一个硬件映射到功能键,即“音量增大”。 现在的问题是“关机/启用wifi”键向硬件发送一个信号以关闭卡的电源。 因此,对于SendKey,没有用于“无线关闭/打开”的虚拟键(尽管有一个用于“音量增大”)

解决方案2:Windows 8 API

现在,另一种方法是在此处使用Windows 8 API,更具体地说,使用以下接口:

  • IMediaRadioManager
  • 伊朗实例
  • IRadioInstanceCollection
  • IMediaRadioManagerNotifySink
这将允许您获得蓝牙、wifi。。。以及“飞行模式”,然后关闭它们,但我从未尝试过将其用于VBS

解决方案3:使用WMI查询

使用WMI查询,您基本上可以访问计算机中的任何内容,包括网卡。 您要查找的类是“Win32\U NetworkAdapter”,所有文档都可以在此处找到:

下面是一个小示例代码,它将列出当前的网络适配器,您可以对此进行自定义,以便在运行脚本之前保存已启用的适配器,以便能够在运行脚本之后重新启用它们

' 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
备注:


你基本上不应该从代码中访问“飞行模式”,因为这是用户的特权,想象一下,如果有人构建了一个应用程序,打开漫游和数据连接,然后在你出国时开始更新…

你有没有尝试过寻找CMD行版本的打开和关闭飞行模式?@CodyG。,是的,我只找到了关于启用/禁用无线适配器的答案,但我不想这样,我想切换飞机模式。考虑到随机激活无线电存在假设的安全隐患,我怀疑这是可能的,也不容易通过设计实现自动化。请看和-,似乎有一些自动IT脚本可能对您有用。这是一个简单的指南。看看能不能帮上忙you@Fadi-然后,只需进行测试,在BIOS中反转电脑的设置并更改功能键优先级-请参阅此处-然后,运行代码,如果它符合您的需要,请查找引用功能键的方法。谢谢@vityta,问题在于
FN
键,我尝试了很多方法并下载了一些应用程序来检测按键,但没有任何东西能够检测到“Fn”键。我不想更改函数键的优先级,因为我在Excel和其他应用程序中使用“F1-F12”键很多年了。@Fadi-如果你只更改5分钟,然后检查代码是否有效,那么你就知道如果你找到一种方法来引用
FN
键,你的任务就准备好了。这只是一个方向。我试过了,检测到一些键,但没有切换飞行模式的键。当我运行你的代码时,它会像以前一样工作,因此从VBA窗口发送
%{F11}
将激活Excel窗口。没有任何更改,我认为活动窗口在这里没有任何影响,因为当我手动按
F12
时,它会切换飞行模式,无论活动窗口是什么。谢谢,运行此代码可以提供30多个适配器,我可以只列出已连接的适配器吗?好的,我可以只列出已连接的适配器,方法是在查询中添加
where Netconnectionstatus=2和PhysicalAdapter=true
,这对我帮助很大,再次感谢。我未能使用API,请给出如何获取“飞行模式”的示例(VBA或VB6)状态(开或关),那太好了。我没有windows API的示例,我还没有使用它。我只知道它存在,但目前网上几乎没有文档。。。