function GetOnlineStatus : Boolean;
var ConTypes : Integer;
begin
  ConTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY;
  if (InternetGetConnectedState(@ConTypes, 0) = False) then Result := False else Result := True;
end;

解决方案 »

  1.   

    当系统连接internet,它会在注册表里改动键值,下面的例子就是告诉你如何获取
    改建值,试试看
    Private Const ERROR_SUCCESS = 0&
    Private Const APINULL = 0&
    Private Const HKEY_LOCAL_MACHINE = &H80000002
    Private ReturnCode As Long
    Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As LongPublic Function ActiveConnection() As Boolean
    Dim hKey As Long
    Dim lpSubKey As String
    Dim phkResult As Long
    Dim lpValueName As String
    Dim lpReserved As Long
    Dim lpType As Long
    Dim lpData As Long
    Dim lpcbData As Long
    ActiveConnection = False
    lpSubKey = "System\CurrentControlSet\Services\RemoteAccess"
    ReturnCode = RegOpenKey(HKEY_LOCAL_MACHINE, lpSubKey, phkResult)
    If ReturnCode = ERROR_SUCCESS Then
    hKey = phkResult
    lpValueName = "Remote Connection"
    lpReserved = APINULL
    lpType = APINULL
    lpData = APINULL
    lpcbData = APINULL
    ReturnCode = RegQueryValueEx(hKey, lpValueName, lpReserved, lpType, ByVal lpData, lpcbData)
    lpcbData = Len(lpData)
    ReturnCode = RegQueryValueEx(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData)
    If ReturnCode = ERROR_SUCCESS Then
    If lpData = 0 Then
    ActiveConnection = False
    Else
    ActiveConnection = True
    End If
    End If
    RegCloseKey (hKey)
    End If
    End Function
    ----------
    判断结果:
    SUB FORM_LOAD()
    If ActiveConnection = True Then
    Call MsgBox("现在处于链结状态。", vbInformation)
    Else
    Call MsgBox("现在处于断开状态。", vbInformation)
    End If
    END SUB
      

  2.   

    我有啊!
    代码如下,不过要给分啊!^_^
    Option Explicit
    '检测本机是否联入互联网,以及以什么形式联入Private Declare Function InternetGetConnectedStateEx Lib "wininet.dll" _
            Alias "InternetGetConnectedStateExA" _
            (ByRef lpdwFlags As Long, _
            ByVal lpszConnectionName As String, _
            ByVal dwNameLen As Long, _
            ByVal dwReserved As Long _
            ) As LongPrivate Enum EIGCInternetConnectionState
            INTERNET_CONNECTION_MODEM = &H1&
            INTERNET_CONNECTION_LAN = &H2&
            INTERNET_CONNECTION_PROXY = &H4&
            INTERNET_RAS_INSTALLED = &H10&
            INTERNET_CONNECTION_OFFLINE = &H20&
            INTERNET_CONNECTION_CONFIGURED = &H40&
    End EnumPrivate Function InternetConnected(Optional ByRef eConnectionInfo _
        As EIGCInternetConnectionState, Optional ByRef _
        sConnectionName As String) As Boolean
        
        Dim dwFlags As Long
        Dim sNameBuf As String
        Dim lR As Long
        Dim iPos As Long
        
        On Error Resume Next
        
        sNameBuf = String$(513, 0)
        lR = InternetGetConnectedStateEx(dwFlags, sNameBuf, 512, 0&)
        eConnectionInfo = dwFlags
        iPos = InStr(sNameBuf, vbNullChar)
        If iPos > 0 Then
            sConnectionName = Left$(sNameBuf, iPos - 1)
        ElseIf Not sNameBuf = String$(513, 0) Then
            sConnectionName = sNameBuf
        End If
        InternetConnected = (lR = 1)
        
    End FunctionPublic Function IsInNet() As Boolean    '检测是否已经以及使用什么方法连接到Internet
        Dim bConnected As Boolean
        Dim eR As Long
        Dim sName As String
        Dim sMsg As String
        
        bConnected = InternetConnected(eR, sName)    '根据获得的结果输出
    '    If (eR And INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM Then
    '        sMsg = sMsg & "使用modem连接到Internet."
    '    End If
    '
    '    If (eR And INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN Then
    '        sMsg = sMsg & "使用内部网连接到Internet."
    '    End If
    '
    '    If (eR And INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY Then
    '        sMsg = sMsg & "通过代理服务器连接到Internet."
    '    End If
    '
    '    If (eR And INTERNET_CONNECTION_OFFLINE) = INTERNET_CONNECTION_OFFLINE Then
    '        sMsg = sMsg & "现在连接处于离线状态."
    '    End If
    '
    '    If (eR And INTERNET_CONNECTION_CONFIGURED) = INTERNET_CONNECTION_CONFIGURED Then
    '        sMsg = sMsg & "连接已经被设定."
    '    Else
    '        sMsg = sMsg & "没有设定好的连接."
    '    End If
    '
    '    If (eR And INTERNET_RAS_INSTALLED) = INTERNET_RAS_INSTALLED Then
    '        sMsg = sMsg & "本机已经安装了远程访问服务功能."
    '    End If
      
        IsInNet = bConnected
      
    End Function如果直接调用,可以通过返回值判断是否联网;如果将其中的注释去掉,还可以得到连网的种类等详细信息。酷吧? 
      

  3.   

    uguess(uguess) 的代码非常好,怎么没见立即给分?
      

  4.   

    uguess:好啊,我简直想帮点分。
      

  5.   

    to uguess(uguess):
    我试了你的代码,却是不行,
    我拔不拔网线返回结果都是true;
    如果你的代码真的可以,我会给你分的!
    对了,我上网是通过代理,ADSL上Internet!
      

  6.   


      哇!生活果真不一样啦,这么多人用ADSL!  嗨,我的这段代码就是不能识别ADSL,但是又有什么关系呢?如果你用金山毒霸你会发现,有时候他连局域网都分不清!我也给我公司的产品做过一个类似的升级程序,用的就是这段代码,虽然有可能判断失误,但只要给用户一个选择不就可以了吗?  不知道你的程序是干什么用的,只以我见过的而言,要想100%确定是否联网,只有通过PING的方法实现(其实这也不一定,虽能保证PING的地址一定会被本机设置的DNS包含呢?就象我公司用的网通,国内外的很多地址都不能PING到,而实际确实存在)。  如果你有更好的方法,说一声!  
      

  7.   

    to uguess(uguess)
    你说不能识辨ADSL
    但是如果我把网线拔了,那返回的结果应该是false吧
    很不辛的是仍是true
    你碰到过这种情况吗?
      

  8.   

    那你试试下面的程序,可以的话,告诉我哦 ;)
    声明:Public Declare Function RasEnumConnections Lib "RasApi32.dll" _
        Alias "RasEnumConnectionsA" (lpRasCon As Any, _
        lpcb As Long, lpcConnections As Long) As Long
    Public Declare Function RasGetConnectStatus Lib "RasApi32.dll" _
        Alias "RasGetConnectStatusA" (ByVal hRasCon As Long, _
        lpStatus As Any) As Long
     
    Public Const RAS95_MaxEntryName = 256
    Public Const RAS95_MaxDeviceType = 16
    Public Const RAS95_MaxDeviceName = 32
     
    Public Type RASCONN95
        dwSize As Long
        hRasCon As Long
        szEntryName(RAS95_MaxEntryName) As Byte
        szDeviceType(RAS95_MaxDeviceType) As Byte
        szDeviceName(RAS95_MaxDeviceName) As Byte
    End Type
     
    Public Type RASCONNSTATUS95
        dwSize As Long
        RasConnState As Long
        dwError As Long
        szDeviceType(RAS95_MaxDeviceType) As Byte
        szDeviceName(RAS95_MaxDeviceName) As Byte
    End Type程序:
    Private Sub main()
        If IsConnected = True Then
            MsgBox "已连接到Internet!", vbInformation, "提示"
        Else
            MsgBox "未连接到Internet!", vbInformation, "提示"
        End If
    End Sub
     
    Public Function IsConnected() As Boolean
        Dim TRasCon(255) As RASCONN95
        Dim lg As Long
        Dim lpcon As Long
        Dim RetVal As Long
        Dim Tstatus As RASCONNSTATUS95
        '
        TRasCon(0).dwSize = 412
        lg = 256 * TRasCon(0).dwSize
        '
        RetVal = RasEnumConnections(TRasCon(0), lg, lpcon)
        If RetVal <> 0 Then
            MsgBox "产生错误!", vbInformation, "提示"
            Exit Function
        End If
        '
        Tstatus.dwSize = 160
        RetVal = RasGetConnectStatus(TRasCon(0).hRasCon, Tstatus)
        If Tstatus.RasConnState = &H2000 Then
            IsConnected = True
        Else
            IsConnected = False
        End If
    End Function
     
      

  9.   


      我想应该这样说: 如果要想完全判断正确,要么自己写有关的底层代码,---我想这不是VB能实现的;要么... 有必要完全正确的判断么?  要知道,微软提供的函数就是这些,没有针对ADSL状态的(至少我这么认为),当然不会返回正确的值了。  另外,如果你见过有能够完全判断正确的软件,通知我一声。   
         
      

  10.   

    to ByTheWay(&#157;到此一游):
        你的也不行!
    to uguess(uguess):
    虽然没有解决我的问题,不过还是非常感谢你的参与!
    对于判断的正确性有误必要,我想是完全有必要的,
    如果告诉你的客户的是虚假信息,那就说明这个软件有很大的bug了!
    明知有bug,难道不去纠正吗?
      

  11.   

       我的程序是这样写的“智能升级程序检测到您的计算机可能没有连入INTERNET,要继续么?”
       我想,这不算是“虚假信息”吧?   更何况现在的新技术层出不穷,你能保证你的程序能认识所有的方式么?就象很久以前做的WINDOWS版本检测程序,以前只能检测到95、98、2000、NT,对于新出来的XP能用么?你能说这是BUG么?你能说检测错误是欺骗客户么? 对,如果在程序中加入有关XP版本的检测,就能用了,但别忘了,这是基于微软提供了这方面函数的基础上实现的,假如微软不再提供这方面的函数,不知阁下会怎么办?
         还是我那句话:有必要完全正确的判断么?
      
         另外:这个能算BUG么? 要知道你的软件是基于WINDOWS上的,连他都不提供判断的方法,这能算你的程序的BUG么?
           
      

  12.   


    同意moonfish(moonfish)的看法:“如果告诉你的客户的是虚假信息,那就说明这个软件有很大的bug了!
    明知有bug,难道不去纠正吗?”
      

  13.   


    判断ip地质还有,ping 一台主机!!!