私はStackOverflowの回答検索で思いついたものをすべて試しましたが、GoogleもBingも私に愛を示していません。ネットワークケーブルがWindowsCEデバイスで、できればCompactFrameworkアプリケーションからいつ接続または切断されたかを知る必要があります。
1 に答える
ここで自分の質問に答えていることに気づきましたが、実はメールでの質問で、実はかなりの時間をかけて答えを見つけたので、ここに投稿します。
したがって、これがどのように検出されるかについての一般的な答えは、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));
}
}
}