2009-10-09 9 views
5

Ho passato tutte le risposte di Overflow dello stack che si sono verificate per la ricerca e né Google né Bing mi stanno mostrando alcun amore. Ho bisogno di sapere quando un cavo di rete è stato collegato o disconnesso su un dispositivo Windows CE, preferibilmente, da un'applicazione Compact Framework.Rilevazione di 'Cavo di rete scollegato' nel Compact Framework

risposta

3

Mi rendo conto che sto rispondendo alla mia domanda qui, ma in realtà era una domanda posta via email, e in realtà ho passato un po 'di tempo a trovare la risposta, quindi la sto postando qui.

Quindi la risposta generale per come viene rilevato è che è necessario richiamare il driver NDIS tramite un IOCTL e indicare che si è interessati alle notifiche. Questo è fatto con il valore IOCTL_NDISUIO_REQUEST_NOTIFICATION (i documenti dicono che questo non è supportato in WinMo, ma i documenti sono sbagliati). Ovviamente ricevere le notifiche non è così semplice - non si ottiene semplicemente un bel richiamo. Invece devi far ruotare uno point to point message queue e inviarlo alla chiamata IOCTL, insieme a una maschera di quali notifiche specifiche desideri. Quindi, quando qualcosa cambia (come il cavo viene tirato) si otterrà una struttura NDISUIO_DEVICE_NOTIFICATION (di nuovo MSDN dice erroneamente che questo è solo CE) sulla coda, che è quindi possibile analizzare per trovare l'adattatore che ha avuto l'evento e ciò che il l'evento esatto è

Dal punto di vista del codice gestito, questo è in realtà un sacco di codice da scrivere - CreateFile per aprire NDIS, tutte le API di accodamento, le strutture per le notifiche, ecc. strada e l'aveva già aggiunto allo Smart Device Framework. Quindi, se stai utilizzando l'SDF, ottieni le notifiche in questo modo:

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)); 
     } 
    } 
} 
Problemi correlati