Pregunta

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 cuando un cable de red se ha conectado o desconectado en un dispositivo Windows CE, preferiblemente, desde una aplicación .NET Compact.

¿Fue útil?

Solución

Me doy cuenta de que estoy respondiendo a mi propia pregunta aquí, pero en realidad fue 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 IOCTL_NDISUIO_REQUEST_NOTIFICATION valor (los documentos dicen que esto no es apoyada en Windows Mobile, pero los documentos están equivocados). Por supuesto, la recepción de las notificaciones no es tan sencillo - que son't acaba de obtener algunas buenas devolución de llamada. En su lugar hay que girar un punto a punto cola de mensajes y enviar que, en la llamada IOCTL, junto con una máscara de los cuales notificaciones específicas que desee. Entonces, cuando algo cambia (como se tira del cable) obtendrá un NDISUIO_DEVICE_NOTIFICATION estructura (de nuevo MSDN dice incorrectamente este es CE-solamente) en la cola, que luego se puede analizar para encontrar el adaptador que tuvo el evento y lo que el evento es exacta.

Desde el punto de vista de código administrado, esto es realmente una gran cantidad de código a tener que escribir - CreateFile para abrir NDIS, todas las API que hacen cola, las estructuras de las notificaciones, etc. Afortunadamente, me había ya pasado por esto y se había añadido al marco Smart Device ya. 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));
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top