我需要一个事件来检测Internet连接/断开连接

时间:2010-12-16 05:39:25

标签: c# .net events windows-7

我们正在开发一个.NET应用程序,其中一个要求是监视系统是否连接到Internet。

我们能够获得“以太网电缆断开”的.NET事件,但如果重置调制解调器,则不会触发此事件。我不想继续ping一些URL来完成这项工作,因为它会增加相当大的性能开销。是否有任何.NET事件可以检查系统是否连接到互联网?

系统托盘中有一个图标,当系统未连接到互联网时,会显示交叉标志或有限的连接标志。这表明Windows知道,我想捕获该事件。

6 个答案:

答案 0 :(得分:22)

您可以使用NetworkChange类, NetworkAvailabilityChanged 事件:

NetworkChange.NetworkAvailabilityChanged += myNetworkAvailabilityChangeHandler;

由于这是一个系统事件,请确保在完成后删除该事件,请在此处查看此帖:You need to be careful about using event handler for NetworkChange

答案 1 :(得分:12)

http://msdn.microsoft.com/en-us/library/ee264321(VS.85).aspx全面覆盖(包括网络连接和网络连接到Internet之间的区别)。我希望你的意思是把Windows 7标签放在你的帖子上,因为这一切都很新。

关键是INetworkListManager.get_IsConnectedToInternet(),它几​​乎与锡上所说的相同。你必须跳了一下才能注册事件等。Code Pack为你提供了一些内容,并有一个你可以适应的网络样本。

答案 2 :(得分:3)

我能够在一定程度上解决这个问题。我能够在Code项目中找到一些示例代码 http://www.codeproject.com/script/Articles/ListVersions.aspx?aid=34650。谢谢大家的回复。

尤其是格雷戈里先生发布的文章链接给了我很多帮助。

答案 3 :(得分:1)

这对我有用!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.NetworkInformation;
namespace ConsoleApplication6
{


    class Program
    {
        private void AvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
        {

            if (e.IsAvailable)
                Console.WriteLine("Network connected!");
            else
                Console.WriteLine("Network dis connected!");
        }
        public void Form1()
        {

            NetworkChange.NetworkAvailabilityChanged += AvailabilityChanged;
        }

        static void Main(string[] args)
        {
            Program p = new Program();

            p.Form1();

            Console.ReadLine();

        }
    }
}

答案 4 :(得分:0)

试试这个:

private void AvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
        {
            if (e.IsAvailable)
                Console.WriteLine("Wi-Fi conectado " + DateTime.Now );
            else
                Console.WriteLine("Wi-Fi desconectado " + DateTime.Now);
        }


        public Inicio()
        {
            InitializeComponent();

            NetworkAvailabilityChangedEventHandler myHandler = new NetworkAvailabilityChangedEventHandler(AvailabilityChanged);
            NetworkChange.NetworkAvailabilityChanged += myHandler;
        }

答案 5 :(得分:-2)

你必须使用WMI。

这是断开连接检测的示例:(测试它创建.vbs文件并运行它)

 strComputer = "."

  Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi")
  Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("Select * from MSNdis_StatusMediaDisconnect") 

  Do While True 
    Set strLatestEvent = colMonitoredEvents.NextEvent 
    Wscript.StdOut.Write "A network connection has been lost: " 
    Wscript.StdOut.Writeline strLatestEvent.InstanceName
  Loop