我已经浏览了所有Stack Overflow答案搜索结果,Google或Bing都没有向我展示任何爱情。我需要知道何时在Windows CE设备上连接或断开网络电缆,最好是从Compact Framework应用程序。
答案 0 :(得分:3)
我意识到我在这里回答了我自己的问题,但这实际上是通过电子邮件提出的一个问题,我实际上花了很长时间才找到答案,所以我在这里发帖。
因此,检测到这种情况的一般答案是您必须通过IOCTL调用NDIS驱动程序并告诉它您对通知感兴趣。这是通过IOCTL_NDISUIO_REQUEST_NOTIFICATION值完成的(文档说这在WinMo中不受支持,但文档是错误的)。当然接收通知并不是那么简单 - 你不会得到一些不错的回调。相反,您必须启动point to point message queue并将其发送到IOCTL调用,以及您想要的特定通知的掩码。然后,当某些内容发生变化时(例如拉出电缆),您将获得队列上的NDISUIO_DEVICE_NOTIFICATION结构(再次MSDN错误地说这是仅限CE),然后您可以解析它以找到具有事件和具体事件是什么。
从托管代码的角度来看,实际上需要编写很多代码 - CreateFile来打开NDIS,所有排队API,通知结构等等。幸运的是,我已经走了这条路并已将其添加到智能设备框架中。因此,如果您使用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));
}
}
}