2009-10-09 15 views
5

He pasado por todo el desbordamiento de pila respuestas Búsqueda viene con, y ni Google o Bing me están mostrando ningún amor. Necesito saber cuándo se ha conectado o desconectado un cable de red en un dispositivo con Windows CE, preferiblemente, desde una aplicación Compact Framework.'Red de cable desconectado' Detectando en el Compact Framework

Respuesta

3

que se dan cuenta de que estoy respondiendo a mi propia pregunta aquí, pero en realidad era una pregunta que a través de correo electrónico, y en realidad pasé bastante tiempo para encontrar la respuesta, así que lo pongo aquí.

Así que la respuesta general de cómo se detecta esto es que usted tiene que llamar al controlador NDIS a través de un IOCTL y decirle que usted está interesado en las notificaciones. Esto se hace con el valor IOCTL_NDISUIO_REQUEST_NOTIFICATION (los documentos dicen que esto no es compatible con WinMo, pero los documentos son incorrectos). Por supuesto, recibir las notificaciones no es tan sencillo: simplemente no puedes obtener una buena devolución de llamada. En su lugar, debe girar un point to point message queue y enviarlo a la llamada IOCTL, junto con una máscara de las notificaciones específicas que desea. Luego, cuando algo cambia (como se tira del cable) obtendrá una estructura NDISUIO_DEVICE_NOTIFICATION (nuevamente, MSDN dice incorrectamente que esto es solo CE) en la cola, que luego puede analizar para encontrar el adaptador que tuvo el evento y cuál es el el evento exacto es

Desde una perspectiva de código administrado, esto es en realidad una gran cantidad de código para tener que escribir - CreateFile para abrir NDIS, todas las API de cola, las estructuras para las notificaciones, etc. Afortunadamente, ya había estado abajo carretera y ya lo había agregado al Smart Device Framework. Así que si usted está utilizando el SDF, recibiendo las notificaciones se ve así:

public partial class TestForm : Form 
{ 
    public TestForm() 
    { 
     InitializeComponent(); 

     this.Disposed += new EventHandler(TestForm_Disposed); 

     AdapterStatusMonitor.NDISMonitor.AdapterNotification += 
      new AdapterNotificationEventHandler(NDISMonitor_AdapterNotification); 
     AdapterStatusMonitor.NDISMonitor.StartStatusMonitoring(); 
    } 

    void TestForm_Disposed(object sender, EventArgs e) 
    { 
     AdapterStatusMonitor.NDISMonitor.StopStatusMonitoring(); 
    } 

    void NDISMonitor_AdapterNotification(object sender, 
             AdapterNotificationArgs e) 
    { 
     string @event = string.Empty; 

     switch (e.NotificationType) 
     { 
      case NdisNotificationType.NdisMediaConnect: 
       @event = "Media Connected"; 
       break; 
      case NdisNotificationType.NdisMediaDisconnect: 
       @event = "Media Disconnected"; 
       break; 
      case NdisNotificationType.NdisResetStart: 
       @event = "Resetting"; 
       break; 
      case NdisNotificationType.NdisResetEnd: 
       @event = "Done resetting"; 
       break; 
      case NdisNotificationType.NdisUnbind: 
       @event = "Unbind"; 
       break; 
      case NdisNotificationType.NdisBind: 
       @event = "Bind"; 
       break; 
      default: 
       return; 
     } 

     if (this.InvokeRequired) 
     { 
      this.Invoke(new EventHandler(delegate 
      { 
       eventList.Items.Add(string.Format(
            "Adapter '{0}' {1}", e.AdapterName, @event)); 
      })); 
     } 
     else 
     { 
      eventList.Items.Add(string.Format(
           "Adapter '{0}' {1}", e.AdapterName, @event)); 
     } 
    } 
} 
Cuestiones relacionadas