在Compact Framework的检测“网络电缆被拔出”(Detecting 'Netw

2019-08-17 16:01发布

我已经通过所有的堆栈溢出的答案搜索来了,也不谷歌或冰都出现了我爱所有。 我需要知道什么时候网络电缆已经连接或断开的Windows CE设备上,preferrably,从Compact Framework的应用程序。

Answer 1:

我知道我在这里回答我的问题,但它实际上是通过电子邮件提出的问题,居然花了我很长一段时间寻找答案,所以我在这里张贴。

因此,对于这个如何检测一般的答案是,你必须通过一个IOCTL向下调入NDIS驱动程序,并告诉它你感兴趣的通知。 这是用做IOCTL_NDISUIO_REQUEST_NOTIFICATION值(文档说,这是不支持的WinMo,但该文档是错误的)。 当然,接收通知并非如此简单 - 你son't只是得到一些不错的回调。 相反,你必须旋转了一个点对点的消息队列 ,并发送到IOCTL呼叫,与具体通知你想有一个面具一起。 然后,当有新的变化(如电缆被拉),你会得到一个NDISUIO_DEVICE_NOTIFICATION结构(MSDN再次错误地说,这是CE-只)队列,然后你就可以分析发现,有事件适配器和什么确切的事件。

从托管代码的角度来看,这实际上是一个很大的代码有写 - CreateFile打开NDIS,所有排队的API,结构的通知等。幸运的是,我已经沿着这条道路,并已加入它已经在智能设备框架。 所以,如果你正在使用自卫队,得到通知如下:

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


文章来源: Detecting 'Network Cable Unplugged' in the Compact Framework