我在VS2005的C#,.NET 3.0中编写了一个应用程序,其功能是监视各种可移动驱动器(USB闪存盘,CD-ROM等)的插入/弹出.我不想使用WMI,因为它可以有时会产生歧义(例如,它可以生成一个单一的USB驱动器插入多个事件),所以我干脆重写我的MainForm赶上WM_DEVICECHANGE消息的WndProc,因为建议在这里.昨天我遇到了一个问题,结果发现我将不得不使用WMI来检索一些模糊的磁盘细节,如序列号.事实证明,从WndProc内部调用WMI例程会抛出DisconnectedContext MDA.
经过一番挖掘后,我结束了一个尴尬的解决方法.代码如下:
// the function for calling WMI
private void GetDrives()
{
ManagementClass diskDriveClass = new ManagementClass("Win32_DiskDrive");
// THIS is the line I get DisconnectedContext MDA on when it happens:
ManagementObjectCollection diskDriveList = diskDriveClass.GetInstances();
foreach (ManagementObject dsk in diskDriveList)
{
// ...
}
}
private void button1_Click(object sender, EventArgs e)
{
// here it works perfectly fine
GetDrives();
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_DEVICECHANGE)
{
// here it …Run Code Online (Sandbox Code Playgroud)