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