5

私はStackOverflowの回答検索で思いついたものをすべて試しましたが、GoogleもBingも私に愛を示していません。ネットワークケーブルがWindowsCEデバイスで、できればCompactFrameworkアプリケーションからいつ接続または切断されたかを知る必要があります。

4

1 に答える 1

3

ここで自分の質問に答えていることに気づきましたが、実はメールでの質問で、実はかなりの時間をかけて答えを見つけたので、ここに投稿します。

したがって、これがどのように検出されるかについての一般的な答えは、IOCTLを介してNDISドライバーを呼び出し、通知に関心があることを伝える必要があるということです。これは、IOCTL_NDISUIO_REQUEST_NOTIFICATION値を使用して行われます(ドキュメントには、これはWinMoでサポートされていないと記載されていますが、ドキュメントは間違っています)。もちろん、通知を受け取るのはそれほど簡単ではありません-あなたはただいくつかの素晴らしいコールバックを受け取るだけではありません。代わりに、ポイントツーポイントのメッセージキューを起動し、必要な特定の通知のマスクとともに、それをIOCTL呼び出しに送信する必要があります。次に、何かが変更されると(ケーブルが引っ張られるなど)、NDISUIO_DEVICE_NOTIFICATIONが表示されますキューの構造(MSDNはこれがCEのみであると誤って言っています)。これを解析して、イベントが発生したアダプターと正確なイベントを見つけることができます。

マネージコードの観点からは、これは実際に作成する必要のある多くのコードです-NDISを開くためのCreateFile、すべてのキューイング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));
        }
    }
}
于 2009-10-09T15:24:01.560 に答える