'daki 'Ağ Kablosu Takılı değil' algılandı Yığın Taşması yanıtlarının tamamı ile arama yaptım ve Google ya da Bing bana herhangi bir sevgi göstermiyor. Bir ağ kablosunun bir Windows CE cihazında, tercihen bir Compact Framework uygulamasından bağlanması veya bağlantısının kesilmesi gerektiğinde bilmem gerek.Compact Framework
cevap
Burada kendi sorumu yanıtladığımı anlıyorum, ama aslında e-posta yoluyla sorulması gereken bir soruydu ve aslında cevabı bulmak için epey harcadım, bu yüzden buraya gönderiyorum.
Bunun nasıl algılandığına dair genel yanıt, bir IOCTL aracılığıyla NDIS sürücüsüne çağırmanız ve bildirimlerle ilgilendiğinizi belirtmenizdir. Bu, IOCTL_NDISUIO_REQUEST_NOTIFICATION değeriyle yapılır (bu, belgelerin WinMo'da desteklenmediğini, ancak belgelerin yanlış olduğunu söylüyor). Tabii ki bildirimleri almak o kadar da kolay değil - sadece hoş bir geri dönüş almıyorsunuz. Bunun yerine, bir point to point message queue'u döndürmek ve IOCTL çağrısına göndermek istediğiniz belirli bildirimleri içeren bir maske ile göndermeniz gerekir. Daha sonra, bir şey değiştiğinde (kablo çekilir gibi), sıradaki bağdaştırıcıyı bulmak için ayrıştırabileceğiniz bir NDISUIO_DEVICE_NOTIFICATION yapısına (yine MSDN, bunun yalnızca CE-olduğunu söylüyor) alırsınız. kesin olaydır.
Yönetilen kod perspektifinden, aslında yazmak zorunda olduğum çok kod - NDIS'yi, tüm sıraya geçirme API'lerini, bildirimlerin yapılarını, vb. Açmak için CreateFile. Çok şükür zaten yol ve zaten Akıllı Cihaz Çerçevesine ekledi. SDF'yi kullanıyorsanız, bildirimleri almak şu şekilde görünür:
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));
}
}
}