在Compact Framework中检测“网络电缆未插入”

时间:2009-10-09 15:15:37

标签: networking compact-framework windows-ce ndis

我已经浏览了所有Stack Overflow答案搜索结果,Google或Bing都没有向我展示任何爱情。我需要知道何时在Windows CE设备上连接或断开网络电缆,最好是从Compact Framework应用程序。

1 个答案:

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