Necesito un evento para detectar la conexión / desconexión de Internet

Estamos desarrollando una aplicación .NET donde uno de los requisitos es monitorear si el sistema está conectado a Internet o no.

Pudimos obtener un evento .NET para “desconexión del cable de ethernet”, pero si el módem se reinicia, este evento no se activará. No quiero seguir haciendo ping a alguna URL para hacerlo, ya que agregará una sobrecarga de rendimiento considerable. ¿Hay algún evento .NET que pueda verificar si el sistema está conectado a internet o no?

Hay un icono en la bandeja del sistema que muestra un signo cruzado o un signo de conectividad limitada cuando el sistema no está conectado a internet. Eso sugiere que Windows sabe, y quiero atrapar ese evento.

Todo esto está cubierto (incluida la diferencia entre estar en la red y hacer que la red lo conecte a Internet) en http://msdn.microsoft.com/en-us/library/ee264321(VS.85).aspx . Espero que quisieras poner esa etiqueta de Windows 7 en tu publicación, porque todo esto es bastante nuevo.

La clave es INetworkListManager.get_IsConnectedToInternet() que prácticamente hace lo que dice en la lata. Debes saltar un poco para registrarte para los eventos, etc. El paquete de códigos lo cubre y tiene una muestra de red que puedes adaptar.

Puede usar la clase NetworkChange , con el evento NetworkAvailabilityChanged :

 NetworkChange.NetworkAvailabilityChanged += myNetworkAvailabilityChangeHandler; 

Como se trata de un evento del sistema, asegúrese de eliminar el evento cuando haya terminado. Consulte esta publicación aquí: debe tener cuidado al usar el controlador de eventos para NetworkChange.

Pude resolver este problema hasta cierto punto. Pude encontrar un código de muestra en el proyecto de código http://www.codeproject.com/script/Articles/ListVersions.aspx?aid=34650 . Gracias a todos por las respuestas.

especialmente el enlace del artículo que fue publicado por el Sr. Gregory me ayudó mucho.

¡Esto funcionó para mí!

 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(); } } } 

prueba con esto:

 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; } 

tienes que usar WMI.

Este es un ejemplo de detección de desconexión: (para probarlo, cree un archivo .vbs y ejecútelo)

  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