1. //判断计算机是否能够连接到Internet的API  
  2. //wininet.dll是Windows应用程序网络相关模块。该文件隶属%\WINDOWS\SYSTEM32目录下动态库连接文件。该文件不可缺失,属于关键链接库。当文件丢失或者损坏时,届时将无法完成Explorer进程(即桌面以及基于该进程的IE浏览器等,可使用不基于IE浏览器进行访问网络) 
  3. public sealed class NetworkHelper 
  4.     { 
  5.         #region 网络状态 
  6.  
  7.         ///  
  8.         /// 监听计时器 
  9.         ///  
  10.         private Timer listenTimer; 
  11.  
  12.  
  13.         private static NetworkHelper instance; 
  14.  
  15.         ///  
  16.         /// 监听间隔 
  17.         ///  
  18.         const int LISTEN_TIME_SPAN = 2000; 
  19.  
  20.         //IsNetworkAlive Description 
  21.         const int NETWORK_ALIVE_LAN = 1; 
  22.         const int NETWORK_ALIVE_WAN = 2; 
  23.         const int NETWORK_ALIVE_AOL = 4; 
  24.  
  25.         const int FLAG_ICC_FORCE_CONNECTION = 1; 
  26.  
  27.  
  28.         private NetworkHelper() 
  29.         { 
  30.  
  31.         } 
  32.  
  33.         static NetworkHelper() 
  34.         { 
  35.             instance = new NetworkHelper(); 
  36.         } 
  37.  
  38.  
  39.         public static NetworkHelper GetNetworkHelperInstance() 
  40.         { 
  41.             return instance; 
  42.         } 
  43.  
  44.         ///  
  45.         /// 检查网络是否连通,有延迟 
  46.         ///  
  47.         ///  
  48.         ///  
  49.         [DllImport("wininet.dll")] 
  50.         private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue); 
  51.  
  52.         ///  
  53.         ///  
  54.         ///  
  55.         /// 连接饿地址 
  56.         /// FLAG_ICC_FORCE_CONNECTION 
  57.         /// 0 
  58.         [DllImport("wininet.dll")] 
  59.         private extern static bool InternetCheckConnection(string lpszUrl, int dwFlags, int dwReserved); 
  60.  
  61.         ///  
  62.         /// 检查网络是否连通,需要启动服务 
  63.         ///  
  64.         ///  
  65.         [DllImport("sensapi.dll")] 
  66.         private extern static bool IsNetworkAlive(out int connectionDescription); 
  67.  
  68.         ///  
  69.         /// 检查是否能建立Internet连接,VISTA不可用 
  70.         ///  
  71.         ///  
  72.         /// 0 
  73.         [DllImport("sensapi.dll")] 
  74.         private extern static bool IsDestinationReachable(string dest, IntPtr ptr); 
  75.  
  76.  
  77.         ///  
  78.         /// 互联网是否可用 
  79.         ///  
  80.         ///  
  81.         public bool IsInternetAlive() 
  82.         { 
  83.             int status; 
  84.             //检查网络是否可用 
  85.             if (IsNetworkAlive(out status)) 
  86.             { 
  87.                 //如果WAN可用,检查能否建立连接 
  88.                 //if (status == NETWORK_ALIVE_WAN) 
  89.                 //{ 
  90.                 if (InternetCheckConnection("http://www.baidu.com", FLAG_ICC_FORCE_CONNECTION, 0) || 
  91.                     InternetCheckConnection("http://www.sina.com.cn", FLAG_ICC_FORCE_CONNECTION, 0) || 
  92.                     InternetCheckConnection("http://www.163.com", FLAG_ICC_FORCE_CONNECTION, 0)) 
  93.                 { 
  94.                     return true//如果能建立连接返回TRUE 
  95.                 } 
  96.                 else 
  97.                     return false
  98.                 //} 
  99.                 //else 
  100.                 //    return false; 
  101.             } 
  102.             return false
  103.         } 
  104.  
  105.         ///  
  106.         /// 为NetworkStatusChanged事件处理程序提供数据 
  107.         ///  
  108.         public class NetworkChangedEventArgs : EventArgs 
  109.         { 
  110.             public NetworkChangedEventArgs(bool status) 
  111.             { 
  112.                 IsNetworkAlive = status; 
  113.             } 
  114.  
  115.             public bool IsNetworkAlive 
  116.             { 
  117.                 get
  118.                 private set
  119.             } 
  120.         } 
  121.  
  122.         ///  
  123.         /// 表示NetworkStatusChanged事件的方法 
  124.         ///  
  125.         public delegate void NetworkChangedEventHandler(object sender, NetworkChangedEventArgs e); 
  126.  
  127.         ///  
  128.         /// 网络状态变更时触发的事件 
  129.         ///  
  130.         public event NetworkChangedEventHandler NetworkStatusChanged; 
  131.  
  132.         ///  
  133.         /// 网络状态变更时触发的事件 
  134.         ///  
  135.         private void OnNetworkStatusChanged(NetworkChangedEventArgs e) 
  136.         { 
  137.             if (NetworkStatusChanged != null
  138.                 NetworkStatusChanged(this, e); 
  139.         } 
  140.  
  141.  
  142.         ///  
  143.         /// 监听网络状态 
  144.         ///  
  145.         public void ListenNetworkStatus(SynchronizationContext context) 
  146.         { 
  147.             //获得当前网络状态,并通知 
  148.            
  149.             bool currentStatus = IsInternetAlive(); 
  150.             OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus)); 
  151.  
  152.             //启动监听网络状态,2秒钟检查一次,当状态变更时触发事件 
  153.             listenTimer = new Timer(delegate 
  154.                                     { 
  155.                                         bool tmpStatus = IsInternetAlive(); 
  156.                                         if (currentStatus != tmpStatus) 
  157.                                         { 
  158.                                             currentStatus = tmpStatus; 
  159.                                             context.Post(delegate { OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus)); },null); 
  160.                                              
  161.                                         } 
  162.                                     } 
  163.                                     , null 
  164.                                     , 0 
  165.                                     , LISTEN_TIME_SPAN); 
  166.  
  167.         } 
  168.  
  169.  
  170.         ///  
  171.         /// 停止监听网络状态 
  172.         ///  
  173.         public void CloseListenNetworkStatus() 
  174.         { 
  175.             listenTimer.Dispose(); 
  176.         }