2009-10-09 2 views
5

Я прошел через все ответы, связанные с переполнением стека, и ни Google, ни Bing не показывают мне никакой любви. Мне нужно знать, когда сетевой кабель был подключен или отключен на устройстве Windows CE, желательно, из приложения Compact Framework.Обнаружение «Сетевой кабель отключен» в Compact Framework

ответ

3

Я понимаю, что я отвечаю на свой собственный вопрос здесь, но на самом деле это вопрос, заданный по электронной почте, и я действительно потратил немало времени на то, чтобы найти ответ, поэтому я размещаю его здесь.

Таким образом, общий ответ на этот вопрос заключается в том, что вам нужно позвонить в драйвер NDIS через IOCTL и сообщить, что вы заинтересованы в уведомлениях. Это делается с помощью значения IOCTL_NDISUIO_REQUEST_NOTIFICATION (документы говорят, что это не поддерживается в WinMo, но документы ошибочны). Конечно, получение уведомлений не так просто - вы просто получаете хороший обратный вызов. Вместо этого вам нужно развернуть point to point message queue и отправить его на вызов IOCTL вместе с маской, в которой вам нужны конкретные уведомления. Затем, когда что-то изменится (например, кабель потянут), вы получите структуру NDISUIO_DEVICE_NOTIFICATION (опять же MSDN неправильно говорит, что это только CE) в очереди, после чего вы можете разобрать, чтобы найти адаптер, в котором было событие, и что точное событие.

С точки зрения управляемого кода это на самом деле много кода, который нужно написать - CreateFile, чтобы открыть NDIS, все API очередей, структуры для уведомлений и т. Д. К счастью, я уже был в этом и уже добавили его в Smart Device Framework. Поэтому, если вы используете SDF, получение уведомлений выглядит следующим образом:

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)); 
     } 
    } 
} 
Смежные вопросы