代码之家  ›  专栏  ›  技术社区  ›  ashleedawg

使用“WlanScan”刷新WiFi网络列表(将api语法从c#转换为vba…或解决方法?)

  •  5
  • ashleedawg  · 技术社区  · 7 年前

    我很乐意接受任何我可以直接自动化的解决方法(cmdline、wmi等) 或间接地 从VBA。(我使用的是64位Windows 7 Home和64位Office 365 Pro。)

    netsh ,或下面的代码,但是 列表不刷新 除非我点击 net

    • 名单上没有 根据某些文档的状态,每60秒自动更新一次。
    • 断开+重新连接NIC

    我想我是 没有得到控制 WlanOpenHandle 根据需要,我是绿色的C转换为VBA。

    没有错误,但WlanScan返回未知代码 1168 .


    的函数声明 VB 改编:

    Public Shared Function WlanScan(ByVal hClientHandle As IntPtr, _
       ByRef pInterfaceGuid As Guid, ByVal pDot11Ssid As IntPtr, _
       ByVal pIeData As IntPtr, ByVal pReserved As IntPtr) As UInteger
    End Function
    

    函数用法 C# :

    Guid g;
    //wlanHndl is the handle returned previously by calling [WlanOpenHandle]
    for (int i = 0; i < infoList.dwNumberOfItems; i++)
    {
    g = infoList.InterfaceInfo[i].InterfaceGuid;
    uint resultCode=WlanScan(wlanHndl, ref g, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
    if (resultCode != 0)
        return;
    }
    

    …和 如何打开手柄,在 C++ (来自 here ):

    dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);
    if (dwResult != ERROR_SUCCESS) {
        wprintf(L"WlanOpenHandle failed with error: %u\n", dwResult);
        return 1;
        // You can use FormatMessage here to find out why the function failed
    }
    

    “取消隐藏:”

    获取(缓存)无线网络列表:

    很好用 -除了不能自己提神。(之前我正在解析 netsh wlan show networks mode=bssid ,也有同样的问题。)

    Option Explicit  'section's source: vbforums.com/showthread.php?632731
    Private Const DOT11_SSID_MAX_LENGTH As Long = 32
    Private Const WLAN_MAX_PHY_TYPE_NUMBER As Long = 8
    Private Const WLAN_AVAILABLE_NETWORK_CONNECTED As Long = 1
    Private Const WLAN_AVAILABLE_NETWORK_HAS_PROFILE As Long = 2
    
    Private Type GUID  'from cpearson.com
        Data1 As Long: Data2 As Integer:  Data3 As Integer:  Data4(7) As Byte
    End Type
    
    Private Type WLAN_INTERFACE_INFO
        ifGuid As GUID: InterfaceDescription(255) As Byte: IsState As Long
    End Type
    
    Private Type DOT11_SSID
        uSSIDLength As Long:            ucSSID(DOT11_SSID_MAX_LENGTH - 1) As Byte
    End Type
    
    Private Type WLAN_AVAILABLE_NETWORK
        strProfileName(511) As Byte:    dot11Ssid As DOT11_SSID
        dot11BssType As Long:           uNumberOfBssids As Long
        bNetworkConnectable As Long:    wlanNotConnectableReason As Long
        uNumberOfPhyTypes As Long:      dot11PhyTypes(WLAN_MAX_PHY_TYPE_NUMBER - 1) As Long
        bMorePhyTypes As Long:          wlanSignalQuality As Long
        bSEcurityEnabled As Long:       dot11DefaultAuthAlgorithm As Long
        dot11DefaultCipherAlgorithm As Long: dwflags As Long: dwReserved As Long
    End Type
    
    Private Type WLAN_INTERFACE_INFO_LIST
        dwNumberOfItems As Long: dwIndex As Long: InterfaceInfo As WLAN_INTERFACE_INFO
    End Type
    
    Private Type WLAN_AVAILABLE_NETWORK_LIST
        dwNumberOfItems As Long:  dwIndex As Long: Network As WLAN_AVAILABLE_NETWORK
    End Type
    
    Declare PtrSafe Function WlanOpenHandle Lib "Wlanapi.dll" (ByVal dwClientVersion As Long, _
                    ByVal pdwReserved As Long, ByRef pdwNegotiaitedVersion As Long, _
                    ByRef phClientHandle As Long) As Long
    
    Declare PtrSafe Function WlanEnumInterfaces Lib "Wlanapi.dll" (ByVal hClientHandle As Long, _
                    ByVal pReserved As Long, ppInterfaceList As Long) As Long
    
    Declare PtrSafe Function WlanGetAvailableNetworkList Lib "Wlanapi.dll" ( _
                    ByVal hClientHandle As Long, pInterfaceGuid As GUID, ByVal dwflags As Long, _
                    ByVal pReserved As Long, ppAvailableNetworkList As Long) As Long
    
    Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, _
                    Source As Any, ByVal Length As Long)
    
    Declare PtrSafe Sub WlanFreeMemory Lib "Wlanapi.dll" (ByVal pMemory As Long)
    
    Type WiFis
      ssid As String: signal As Single
    End Type
    
    Public Function GetWiFi() As WiFis()
    'returns an array of custom type WiFis (1st interface only)
    
        Dim udtList As WLAN_INTERFACE_INFO_LIST, udtAvailList As WLAN_AVAILABLE_NETWORK_LIST, udtNetwork As WLAN_AVAILABLE_NETWORK
        Dim lngReturn As Long, lngHandle As Long, lngVersion As Long, lngList As Long, lngAvailable As Long
        Dim lngStart As Long, intCount As Integer, ssid As String, signal As Single, wifiOut() As WiFis
        n = 0
    
        lngReturn = WlanOpenHandle(2&, 0&, lngVersion, lngHandle) 'get handle
        If lngReturn <> 0 Then
            Debug.Print "Couldn't get wlan handle (Code " & lngReturn & ")"
            Exit Function
        End If
    
        lngReturn = WlanEnumInterfaces(ByVal lngHandle, 0&, lngList) 'enumerate <*first interface only*>
        CopyMemory udtList, ByVal lngList, Len(udtList)
        lngReturn = WlanGetAvailableNetworkList(lngHandle, udtList.InterfaceInfo.ifGuid, 2&, 0&, lngAvailable) 'get network list
        CopyMemory udtAvailList, ByVal lngAvailable, LenB(udtAvailList)
        intCount = 0
        lngStart = lngAvailable + 8
    
        Do
            CopyMemory udtNetwork, ByVal lngStart, Len(udtNetwork) ' Populate avail. network structure
            ssid = Replace(StrConv(udtNetwork.dot11Ssid.ucSSID, vbUnicode), Chr(0), "")
            If Len(ssid) < 4 Then ssid = "(Unnamed)"
            signal = CSng(udtNetwork.wlanSignalQuality) / 100
            '[Signal] = 0 to 100 which represents the signal strength (100 Signal)=(-100dBm RSSI), (100 Signal)=(-50dBm RSSI)
    
            If udtNetwork.dwflags = 0 Then
                n = n + 1
                ReDim Preserve wifiOut(n)
                wifiOut(n).ssid = ssid
                wifiOut(n).signal = signal
            Else
                'skipping networks with [dwflags] > 0
                'I *think* that's what I'm supposed to do
                'Returns 3 for currently connected network, 2 for networks that have profiles
            End If
    
            intCount = intCount + 1
            lngStart = lngStart + Len(udtNetwork)
        Loop Until intCount = udtAvailList.dwNumberOfItems
        WlanFreeMemory lngAvailable     'clean up memory
        WlanFreeMemory lngList
    
        GetWiFi = wifiOut   'Success! (function is populated with cached network list)
    
    End Function
    

    …问题是:

    WlanScan

    确实如此 生成VBA错误,但是 1168 Source )

    'Added blindly:'wlanui type library (wlanui.dll) and "wlan pref iua" (wlanconn.dll)
    
    Public Type DOT11_SSID 
       uSSIDLength As LongPtr: ucSSID As String
    End Type
    
    Private Type GUID 'from cpearson.com/excel/CreateGUID.aspx
        Data1 As LongPtr: Data2 As Integer
        Data3 As Integer: Data4(0 To 7) As Byte
    End Type
    
    #If Win64 Then 'also new to Office-64bit, but seems okay
        Declare PtrSafe Function WlanScan Lib "Wlanapi.dll" _
            (ByVal hClientHandle As LongPtr, ByRef pInterfaceGuid As GUID, _
            ByVal pDot11Ssid As LongPtr, ByVal pIeData As LongPtr, _
            ByVal pReserved As LongPtr) As LongPtr
    #Else
        Private Declare WlanScan Lib "Wlanapi.dll" _
            (ByVal hClientHandle As LongPtr, ByRef pInterfaceGuid As GUID, _
            ByVal pDot11Ssid As LongPtr, ByVal pIeData As LongPtr, _
            ByVal pReserved As LongPtr) As LongPtr
    #End If
    
    Sub test_RefreshNetworkList()
        Dim hresult As LongPtr, phClientHandle As Long, pdwNegotiatedVersion As Long
        Dim retVal As Longptr, g As GUID
        hresult = WlanOpenHandle(2&, 0&, pdwNegotiatedVersion, phClientHandle)
        retVal = WlanScan(phClientHandle, g, 0, 0, 0)
        Select Case retVal
            Case 87: Debug.Print "ERROR_INVALID_PARAMETER"
            Case 6: Debug.Print "ERROR_INVALID_HANDLE"
            Case 8: Debug.Print "ERROR_NOT_ENOUGH_MEMORY"
            Case Else: Debug.Print "RPC_STATUS : " & retVal  ' "misc errors"
        End Select
    End Sub
    

    当然有一种迂回的方法可以从VBA刷新网络列表吗?我对我可以自动化的解决方法很酷。。。有什么吗?!

    paw 谢谢!


    我变了 Long LongPtr 在合适的地方。同样的错误。

    WlanOpenHandle 定义。

    Declare PtrSafe Function WlanOpenHandle Lib "Wlanapi.dll" 
        (ByVal dwClientVersion As LongPtr, _
         ByVal pdwReserved As LongPtr, 
         ByRef pdwNegotiaitedVersion As LongPtr, _
         ByRef phClientHandle As LongPtr           ) As LongPtr
    

    (…这也是我第一次尝试使用编译器常量。)

    #If Win64 Then
        Declare PtrSafe Function WlanScan Lib "Wlanapi.dll" _
            (ByVal hClientHandle As LongPtr,
             ByRef pInterfaceGuid As GUID, _
             ByVal pDot11Ssid As LongPtr, 
             ByVal pIeData As LongPtr, _
             ByVal pReserved As LongPtr) As LongPtr
    #Else
        Private Declare WlanScan Lib "Wlanapi.dll" _
            (ByVal hClientHandle As LongPtr, 
             ByRef pInterfaceGuid As GUID, _
             ByVal pDot11Ssid As LongPtr, 
             ByVal pIeData As LongPtr, _
             ByVal pReserved As LongPtr     ) As LongPtr
    #End If
    
    3 回复  |  直到 7 年前
        1
  •  4
  •   Erik A    7 年前

    我认为你不刷新的主要问题是你从来没有关闭你打开的句柄。这可能会导致问题,因为afaik不应该有多个打开的句柄。

    你用 WlanOpenHandle 要获得接口的句柄,但在处理完它并获得所需的信息后,应该调用 WlanCloseHandle 以关闭该句柄和关联的连接。

    Declare PtrSafe Function WlanCloseHandle Lib "Wlanapi.dll" ( _
      ByVal hClientHandle As LongPtr, _
      Optional ByVal pReserved As LongPtr) As Long
    

    在你的任务结束时:

        WlanCloseHandle lngHandle 'Close handle
        GetWiFi = wifiOut   'Success! (function is populated with cached network list)
    End Function
    

    我也改变了一些小事情,比如使用 LongPtr 为指针,使您的代码64位兼容(注意:它是 VBA6兼容,这需要大量的条件编译)、重写声明以不使用可选参数以及其他一些小事情。

    Public Function GetWiFi() As wifis()
    'returns an array of custom type WiFis (1st interface only)
    
        Dim udtList As WLAN_INTERFACE_INFO_LIST, udtAvailList As WLAN_AVAILABLE_NETWORK_LIST, udtNetwork As WLAN_AVAILABLE_NETWORK
        Dim lngReturn As Long, pHandle As LongPtr, lngVersion As Long, pList As LongPtr, pAvailable As LongPtr
        Dim pStart As LongPtr, intCount As Integer, ssid As String, signal As Single, wifiOut() As wifis
        Dim n As Long
        n = 0
    
        lngReturn = WlanOpenHandle(2&, 0&, lngVersion, pHandle) 'get handle
        If lngReturn <> 0 Then
            Debug.Print "Couldn't get wlan handle (Code " & lngReturn & ")"
            Exit Function
        End If
    
        lngReturn = WlanEnumInterfaces(ByVal pHandle, 0&, pList) 'enumerate <*first interface only*>
        CopyMemory udtList, ByVal pList, Len(udtList)
        lngReturn = WlanScan(pHandle, udtList.InterfaceInfo.ifGuid)
        lngReturn = WlanGetAvailableNetworkList(pHandle, udtList.InterfaceInfo.ifGuid, 2&, 0&, pAvailable) 'get network list
        CopyMemory udtAvailList, ByVal pAvailable, LenB(udtAvailList)
        intCount = 0
        pStart = pAvailable + 8
    
        Do
            CopyMemory udtNetwork, ByVal pStart, Len(udtNetwork) ' Populate avail. network structure
            ssid = Replace(StrConv(udtNetwork.dot11Ssid.ucSSID, vbUnicode), Chr(0), "")
            If Len(ssid) < 4 Then ssid = "(Unnamed)"
            signal = CSng(udtNetwork.wlanSignalQuality) / 100
            '[Signal] = 0 to 100 which represents the signal strength (100 Signal)=(-100dBm RSSI), (100 Signal)=(-50dBm RSSI)
    
            If udtNetwork.dwflags = 0 Then
                n = n + 1
                ReDim Preserve wifiOut(n)
                wifiOut(n).ssid = ssid
                wifiOut(n).signal = signal
            Else
                'skipping networks with [dwflags] > 0
                'I *think* that's what I'm supposed to do
                'Returns 3 for currently connected network, 2 for networks that have profiles
            End If
    
            intCount = intCount + 1
            pStart = pStart + Len(udtNetwork)
        Loop Until intCount = udtAvailList.dwNumberOfItems
        WlanFreeMemory pAvailable     'clean up memory
        WlanFreeMemory pList
        WlanCloseHandle pHandle 'Close handle
        GetWiFi = wifiOut   'Success! (function is populated with cached network list)
    End Function
    

    类型和常量:

    Private Const DOT11_SSID_MAX_LENGTH As Long = 32
    Private Const WLAN_MAX_PHY_TYPE_NUMBER As Long = 8
    Private Const WLAN_AVAILABLE_NETWORK_CONNECTED As Long = 1
    Private Const WLAN_AVAILABLE_NETWORK_HAS_PROFILE As Long = 2
    
    Public Type GUID
        Data(15) As Byte
    End Type
    
    Private Type WLAN_INTERFACE_INFO
        ifGuid As GUID: InterfaceDescription(255) As Byte: IsState As Long
    End Type
    
    Private Type DOT11_SSID
        uSSIDLength As Long:            ucSSID(DOT11_SSID_MAX_LENGTH - 1) As Byte
    End Type
    
    Private Type WLAN_AVAILABLE_NETWORK
        strProfileName(511) As Byte:    dot11Ssid As DOT11_SSID
        dot11BssType As Long:           uNumberOfBssids As Long
        bNetworkConnectable As Long:    wlanNotConnectableReason As Long
        uNumberOfPhyTypes As Long:      dot11PhyTypes(WLAN_MAX_PHY_TYPE_NUMBER - 1) As Long
        bMorePhyTypes As Long:          wlanSignalQuality As Long
        bSEcurityEnabled As Long:       dot11DefaultAuthAlgorithm As Long
        dot11DefaultCipherAlgorithm As Long: dwflags As Long: dwReserved As Long
    End Type
    
    Private Type WLAN_INTERFACE_INFO_LIST
        dwNumberOfItems As Long: dwIndex As Long: InterfaceInfo As WLAN_INTERFACE_INFO
    End Type
    
    Private Type WLAN_AVAILABLE_NETWORK_LIST
        dwNumberOfItems As Long:  dwIndex As Long: Network As WLAN_AVAILABLE_NETWORK
    End Type
    
    Public Type WiFis
      ssid As String: signal As Single
    End Type
    

    Declare PtrSafe Function WlanOpenHandle Lib "Wlanapi.dll" (ByVal dwClientVersion As Long, _
                    ByVal pdwReserved As LongPtr, ByRef pdwNegotiaitedVersion As Long, _
                    ByRef phClientHandle As LongPtr) As Long
    
    Declare PtrSafe Function WlanEnumInterfaces Lib "Wlanapi.dll" (ByVal hClientHandle As LongPtr, _
                    ByVal pReserved As LongPtr, ByRef ppInterfaceList As LongPtr) As Long
    
    Declare PtrSafe Function WlanGetAvailableNetworkList Lib "Wlanapi.dll" ( _
                    ByVal hClientHandle As LongPtr, ByRef pInterfaceGuid As GUID, ByVal dwflags As Long, _
                    ByVal pReserved As LongPtr, ByRef ppAvailableNetworkList As LongPtr) As Long
    
    
    Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, _
                    Source As Any, ByVal Length As Long)
    
    Declare PtrSafe Function WlanScan Lib "Wlanapi.dll" _
            (ByVal hClientHandle As LongPtr, ByRef pInterfaceGuid As GUID, _
            Optional ByVal pDot11Ssid As LongPtr, Optional ByVal pIeData As LongPtr, _
            Optional ByVal pReserved As LongPtr) As Long
    
    Declare PtrSafe Function WlanCloseHandle Lib "Wlanapi.dll" ( _
      ByVal hClientHandle As LongPtr, _
      Optional ByVal pReserved As LongPtr) As Long
    
    
    Declare PtrSafe Sub WlanFreeMemory Lib "Wlanapi.dll" (ByVal pMemory As LongPtr)
    

    Public Sub PrintWifis()
        Dim aWifis() As wifis
        aWifis = GetWiFi
        Dim l As Long
        For l = LBound(aWifis) To UBound(aWifis)
            Debug.Print aWifis(l).ssid; aWifis(l).signal
        Next
    End Sub
    
        2
  •  3
  •   EvR    7 年前

    关于这些评论:

    除非我实际单击网络连接图标,否则列表不会刷新

    当然有一种迂回的方法可以从VBA刷新网络列表吗? 我对我可以自动化的解决方法很酷。。。有什么吗?!

    Sub ClickIt()
    With CreateObject("WScript.Shell")
        .Run "%windir%\explorer.exe ms-availablenetworks:"
    End With
    End Sub
    

    你可以用鼠标事件关闭它应用程序。等等当需要一些时间来刷新时

        3
  •  2
  •   QHarr    7 年前

    这个项目之所以成为一项任务是因为 似乎 直截了当,好几次。我的第一次尝试捕获了 netsh wlan show networks mode=bssid 但我没能把名单弄清楚 刷新 . 我想如果改用API方法刷新会很容易( WlanScan + WlanGetAvailableNetworkList 仍然 无法刷新数据。

    发布此问题后,EvR answer 最终/最终使我能够在Windows通知区域中打开/关闭网络连接列表,这刷新了缓存的文本,因此我第三次重新编写了这个过程,返回到使用 netsh . 我终于尝试了3次(下图),然后看到了埃里克的 answer

    所以,我很明显会选择“最终尝试4”,但我想我还是会发布这个备选答案,因为有些概念很容易转移到其他问题上,在这些问题上 乱劈 修理

    Option Compare Binary
    Option Explicit
    
    Public Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" (ByVal hWnd _
        As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters _ 
        As String, ByVal lpDirectory As String, ByVal nShowCmd As LongPtr) As LongPtr
    Public Declare Function GetWindowText Lib "User32.dll" Alias "GetWindowTextA" _
        (ByVal hWnd As LongPtr, ByVal lpString As String, ByVal cch As LongPtr) As LongPtr
    Public Declare Function GetForegroundWindow Lib "User32.dll" () As LongPtr
    
    Type WiFis
        ssid As String      'wifi network name
        signal As Single    'wifi signal strength%
    End Type
    
    Private Function IsNetworksWindow(hWnd As Long, nCaption As String) As Boolean
    'returns TRUE if the window caption (title) of window [hWnd]=[nCaption]
        Dim title As String * 255
        GetWindowText hWnd, title, 255                                  'get window caption
        IsNetworksWindow = (nCaption = Left$(title, Len(nCaption)))
    End Function
    
    Sub RefreshWifiList()
    'open "available networks" window (to refresh cached network list)
        Const clsID = "shell:::{38A98528-6CBF-4CA9-8DC0-B1E1D10F7B1B}" 'clsid of req'd window
        Const nCaption = "View Available Networks"                     'title of req'd  window
        Dim retVal As LongPtr
        retVal = ShellExecute(0, "open", clsID, "", "", 0)             'open clsID
        If retVal < 33 Then Stop    'Error. Full list here: [http://oehive.org/node/528]
        Do
        DoEvents: Loop While Not IsNetworksWindow(GetForegroundWindow, nCaption) 'wait for refresh
        ThisWorkbook.Activate: AppActivate Application.Caption           'return to Excel
    End Sub
    
    Public Function getCmdLineOutput(cmd As String) As String
    'run cmdline in hidden window and return string of output
        Dim tmpFile As String: tmpFile = Environ("temp") & "\cmd_out.tmp" 'create tmp file
        If Dir(tmpFile) <> "" Then Kill tmpFile                         'delete tmp file
        With CreateObject("WScript.Shell")                              'run cmdline command
            .Run "cmd /c """ & cmd & """ > " & tmpFile, 0, True         '0=Hide Window
        End With
        With CreateObject("Scripting.FileSystemObject")                 'open fso
            getCmdLineOutput = Trim(.opentextfile(tmpFile).ReadAll())   'read temp file
            .DeleteFile tmpFile                                         'delete temp file
        End With
    End Function
    
    Public Function GetWiFi() As WiFis()
    'extract [ssid]'s & [signal]'s from list to populate array of networks
        Dim stNet As String, pStart As Long, pStop As Long: pStop = 1
        Dim ssid As String, signal As String, wiFi() As WiFis: ReDim wiFi(0 To 0)
    
        Application.ScreenUpdating = False
        RefreshWifiList                                                 'refresh wifi list
        stNet = getCmdLineOutput("netsh wlan show networks mode=bssid") 'get network list
        stNet = Mid$(stNet, InStr(stNet, "SSID"))                       'trim extraneous chars
        stNet = Replace(Replace(Replace(stNet, " ", ""), vbCrLf, ""), vbLf & vbLf, vbLf)
    
        Do While InStr(pStop, stNet, "SSID") > 0
            pStart = InStr(InStr(pStop, stNet, "SSID"), stNet, ":") + 1   'find ssid start
            pStop = InStr(pStart, stNet, "Networktype")                   'find ssid stop
            ssid = Mid$(stNet, pStart, pStop - pStart)                    'extract ssid
            pStart = InStr(pStop, stNet, "Signal:") + 7                   'find signal start
            pStop = InStr(pStart, stNet, "%")                             'find signal stop
            signal = CSng(Mid$(stNet, pStart, pStop - pStart)) / 100      'extract signal
            If signal = 0 Then Stop: If ssid = "" Then ssid = "(Unnamed)" 'validate
    
            ReDim Preserve wiFi(UBound(wiFi) + 1)                         'populate array
            wiFi(UBound(wiFi)).ssid = ssid: wiFi(UBound(wiFi)).signal = signal
        Loop
    
        GetWiFi = wiFi
    End Function
    
    Sub demo()
        Dim wiFi() As WiFis, netNum As Long
        wiFi() = GetWiFi()                                      'populate array of networks
        For netNum = 1 To UBound(wiFi)                          'loop through networks
            With wiFi(netNum)
                Debug.Print .ssid, Format(.signal, "0%")        'print ssid & signal
            End With
        Next netNum
    End Sub
    
    Sub timeTest_listNetworks()
        Dim wiFi() As WiFis, netNum As Long, n As Long
        Dim startTime As Single, allTime As Single: allTime = Timer
        For n = 1 To 5                      'repeat test 5x
            Erase wiFi()                    'clear array
            startTime = Timer
            wiFi() = GetWiFi()              'refresh array of networks
            For netNum = 1 To UBound(wiFi)  'loop through networks
                Debug.Print wiFi(netNum).ssid & "=" & Format(wiFi(netNum).signal, "0%") & " ";
            Next netNum
            Debug.Print "(" & Round(Timer - startTime, 1) & " sec)"
        Next n
        Debug.Print "Total: " & Round(Timer - allTime, 1) & " sec"
    End Sub
    

    推荐文章