805333 发表于 2009-12-12 01:28:51

如何得到本机的本地网卡连接速度!

在论坛上找了N个测试都有问题,写这样的程序主要是想用于网吧找哪些机器的网线不正常的,比如说是千M的网络,那台机器只跑到100M,说明网线有问题,作个记录,方便解决问题,但试了论坛上的几个程序,都有问题,我把网络取了,他还是1000M,明明是100M的网卡,得到的速度也是1000M,所以希望高手来指点一下啊!

马甲 发表于 2009-12-12 01:45:23

从注册表获取的,测试了好几种网卡,都能正常判断。

_NetworkAdapterInfo() 这个UDF我稍微改了下。最后一项就是网卡实际的速度了。#Include <Array.au3>


$NetworkAdapterInfo = _NetworkAdapterInfo()

_ArrayDisplay($NetworkAdapterInfo, "NetworkAdapterInfo")


Func GetSpeed($ID)
        $NetKey = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}"
        $i = 1
        While 1
                $Idx = RegEnumKey($NetKey,$i)
                If @error Then ExitLoop
                $Sid = RegRead($NetKey&"\"&$Idx,"NetCfgInstanceId")
                If $Sid = $ID Then
                        $P = 1
                        While 1
                                $Params = RegEnumKey($NetKey&"\"&$Idx&"\Ndi",$P)
                                If @error Then ExitLoop
                                If StringInStr($Params,"Params") > 0 Then
                                        $C = 1
                                        While 1
                                                $IN = RegEnumKey($NetKey&"\"&$Idx&"\Ndi\"&$Params,$C)
                                                If @error Then ExitLoop
                                                $Mode = RegRead($NetKey&"\"&$Idx&"\Ndi\"&$Params&"\"&$IN,"ParamDesc")
                                                If (StringInStr($Mode,"速度") > 0 And StringInStr($Mode,"双工") > 0) Or _
                                                (StringInStr($Mode,"speed") > 0 And StringInStr($Mode,"duplex") > 0) Or _
                                                (StringInStr($Mode,"Media") > 0 And StringInStr($Mode,"Type") > 0) Or _
                                                (StringInStr($Mode,"Connection") > 0 And StringInStr($Mode,"Type") > 0) Then
                                                        Dim $aSpeed
                                                        $aSpeed = 0
                                                        $X = 1
                                                        While 1
                                                                $SP = RegEnumVal($NetKey&"\"&$Idx&"\Ndi\params\"&$IN&"\enum",$X)
                                                                If @error then ExitLoop
                                                                $SPTEMP = RegRead($NetKey&"\"&$Idx&"\Ndi\params\"&$IN&"\enum",$SP)
                                                                $Speed = GetNo($SPTEMP)
                                                                If $Speed <> "" then
                                                                        _ArrayAdd($aSpeed, $Speed)
                                                                EndIf
                                                                $X = $X + 1
                                                        WEnd
                                                        Return _ArrayMax($aSpeed)
                                                EndIf
                                                $C = $C + 1
                                        WEnd
                                EndIf
                                $P = $P + 1
                        WEnd
                EndIf
                $i = $i + 1
        WEnd
        Return 0
EndFunc

Func GetNo($ZHI)
        $Exp = StringRegExp($ZHI, "\d+.\d+|\d+", 1)
        If Not @error Then
                If StringInStr($Exp,".") > 0 then
                        Return $Exp * 1000
                Else
                        Return $Exp
                EndIf
        Else
                Return ""
        EndIf
EndFunc

Func _NetworkAdapterInfo()
        ;======================================================
        ;
        ; 函数名称:      _NetworkAdapterInfo()
        ; 详细信息:      获取系统所有网卡信息
        ; 返回值说明:
        ; 以二维数组方式返回.例如 $info=_NetworkAdapterInfo()
        ; $info 网卡数量
        ; $info 第一块网卡的标志1
        ; $info 第一块网卡的状态
        ; 状态说明:7为网卡未插网线,2为网卡连接正常
        ; $info 第一块网卡的网卡名称
        ; $info 第一块网卡的连接名称
        ; $info 第一块网卡的MAC地址
        ; $info 第一块网卡的IP地址
        ; $info 第一块网卡的最高速度
        ; 第二块网卡:
        ; $info 第二块网卡的标志1
        ; $info 第二块网卡的最高速度
        ; 其他网卡信息依次类推。。。
        ; 注意,此UDF不会获取已经禁用的网卡。
       
        ; 作者:      Sanhen (gxbeiliu@163.com)
        ; 网站: www.lunhui.net.cnwww.autoitx.com
        ;======================================================
        Local $colItem
        Local $objItem
        Local $colItems
        Local $objItems
        Local $objWMIService
        Local $Adapters
        $Adapters = 0
        $objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
        $colItem = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus >0", "WQL", 0x30)
        If IsObj($colItem) Then
                For $objItem In $colItem
                        If $objItem.MACAddress = "00:00:00:00:00:00" Then ContinueLoop
                        $Adapters += 1
                        ReDim $Adapters
                        $Adapters[$Adapters] += $Adapters
                        $Adapters[$Adapters] = $objItem.NetConnectionStatus
                        $Adapters[$Adapters] = $objItem.Description
                        $Adapters[$Adapters] = $objItem.NetConnectionID
                        $Adapters[$Adapters] = $objItem.MACAddress
                        $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress = "' & $Adapters[$Adapters] & '" And IPEnabled = True ', "WQL", 0x30)
                        If IsObj($colItems) Then
                                For $objItems In $colItems
                                        ;if $objItem1.IPAddress(0) = "0.0.0.0" Then ContinueLoop
                                        $Adapters[$Adapters] = $objItems.IPAddress(0)
                                        $Adapters[$Adapters] = $objItems.SettingID
                                        $Adapters[$Adapters] = GetSpeed($objItems.SettingID)
                                Next
                        EndIf
                Next
        EndIf

        Return $Adapters

EndFunc   ;==>_NetworkAdapterInfo

马甲 发表于 2009-12-12 01:46:50

再发一个给你试试。#Include <Array.au3>

$NetKey = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}"

$i = 1
While 1
        $ID = RegEnumKey($NetKey,$i)
        If @error <> 0 then ExitLoop
        $o = 1
        While 1
                $IN = RegEnumKey($NetKey&"\"&$ID&"\Ndi\params",$o)
                If @error <> 0 then ExitLoop
                $Mode = RegRead($NetKey&"\"&$ID&"\Ndi\params\"&$IN,"ParamDesc")
                If (StringInStr($Mode,"速度") > 0 And StringInStr($Mode,"双工") > 0) Or _
                        (StringInStr($Mode,"speed") > 0 And StringInStr($Mode,"duplex") > 0) Or _
                        (StringInStr($Mode,"Media") > 0 And StringInStr($Mode,"Type") > 0) Or _
                        (StringInStr($Mode,"Connection") > 0 And StringInStr($Mode,"Type") > 0) Then
                        Dim $aSpeed
                        $aSpeed = RegRead($NetKey&"\"&$ID,"DriverDesc")
                        $Sid = RegRead($NetKey&"\"&$ID,"NetCfgInstanceId")
                        $Name = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\"&$Sid&"\Connection","Name")
                        $aSpeed = $Name
                        $aSpeed = 0
                        $x = 1
                        While 1
                                $SP = RegEnumVal($NetKey&"\"&$ID&"\Ndi\params\"&$IN&"\enum",$x)
                                If @error then ExitLoop
                                $SPTEMP = RegRead($NetKey&"\"&$ID&"\Ndi\params\"&$IN&"\enum",$SP)
                                $Speed = GetNo($SPTEMP)
                                If $Speed <> "" then
                                        _ArrayAdd($aSpeed, $Speed)
                                EndIf
                                $x = $x + 1
                        WEnd
                        MsgBox(0,"",$aSpeed&@CR&$aSpeed&": "&_ArrayMax($aSpeed,2)&" M")
                        ;_ArrayDisplay($aSpeed, "")
                EndIf
                $o = $o + 1
        WEnd
        $i = $i + 1
WEnd

Func GetNo($ZHI)
        $Exp = StringRegExp($ZHI, "\d+.\d+|\d+", 1)
        If Not @error Then
                If StringInStr($Exp,".") > 0 then
                        Return $Exp * 1000
                Else
                        Return $Exp
                EndIf
        Else
                Return ""
        EndIf
EndFunc

llztt 发表于 2009-12-12 08:25:51

又当前的下载速度没,呵呵

wyl0205 发表于 2009-12-12 13:12:35

先做记号,指不定什么时候用得上。。

redapple2008 发表于 2009-12-13 22:50:39

做记号,说不定什么时候用得上。。
页: [1]
查看完整版本: 如何得到本机的本地网卡连接速度!