Compact Frameworkの中で「ネットワークケーブルアンプラグド」を検出
-
20-09-2019 - |
質問
私はスタックオーバーフローの全てを進めてきたが、検索が思い付く応答し、GoogleやBingのどちらが私にどんな愛を見せています。私は、ネットワークケーブルがCompact Frameworkのアプリケーションから、できれ、WindowsのCEデバイス上で接続または切断されたときに知っておく必要があります。
解決
私はここで自分の質問に答えるよ実現するが、それは実際に電子メールを介しての問いだった、と私は実際にその答えを見つけるのかなり長い間を過ごしたので、私はそれをここに掲示しています。
だから、これが検出された方法のための一般的な答えは、あなたがIOCTLを経由してNDISドライバにダウン呼び出し、あなたは通知に興味を持っているということを教えなければならないことです。これは IOCTL_NDISUIO_REQUEST_NOTIFICATION の値で行われます(ドキュメントは、これがないと言います)Windows Mobile搭載でサポートされていますが、ドキュメントが間違っています。もちろん、通知を受信することはそれほど単純ではありません - あなただけのいくつかの素晴らしいコールバックを取得son't。代わりに、メッセージキューをポイントして送信するためにポイントをスピンアップする必要がありますあなたが望むどの特定の通知のマスクと一緒に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));
}
}
}