次のコードを使用して、WMI を使用してディスク ドライブへの新しいメディアの挿入を検出しようとしました。しかし、DriveInfo.GetDrives でバックグラウンド スレッドでループを使用するようなマネージド ソリューションはありますか? これを行う最良の方法はどれですか?次のコードを試したときに、「ディスクがドライブにありません。ディスクを挿入してください」というダイアログが表示され、他の PC で中止、再試行、続行ボタンが表示されます。5 月のマシンでは正常に動作します。
private void DriveWatcher()
{
try
{
var wqlEventQuery = new WqlEventQuery
{
EventClassName = "__InstanceModificationEvent",
WithinInterval = new TimeSpan(0, 0, 1),
Condition =
@"TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.DriveType = 5"
};
var connectionOptions = new ConnectionOptions
{
EnablePrivileges = true,
Authority = null,
Authentication = AuthenticationLevel.Default
};
var managementScope = new ManagementScope("\\root\\CIMV2", connectionOptions);
ManagementEventWatcher = new ManagementEventWatcher(managementScope, wqlEventQuery);
ManagementEventWatcher.EventArrived += CdrEventArrived;
ManagementEventWatcher.Start();
}
catch (ManagementException e)
{
MessageBox.Show(e.Message, e.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void CdrEventArrived(object sender, EventArrivedEventArgs e)
{
var wmiDevice = (ManagementBaseObject) e.NewEvent["TargetInstance"];
if (wmiDevice.Properties["VolumeName"].Value != null)
GetDrives();
else
GetDrives();
}
private void GetDrives()
{
if (InvokeRequired)
{
Invoke(new GetDrivesDelegate(GetDrives));
}
else
{
toolStripComboBoxDrives.Items.Clear();
DriveInfo[] drives = DriveInfo.GetDrives();
_drives = new Dictionary<string, DriveInfo>();
int selectedIndex = 0;
foreach (DriveInfo drive in drives)
{
if (drive.DriveType.Equals(DriveType.CDRom))
{
if (drive.IsReady)
{
string name = string.Format("{0} ({1})", drive.VolumeLabel, drive.Name.Substring(0, 2));
int selectedDrive = toolStripComboBoxDrives.Items.Add(name);
_drives.Add(name, drive);
selectedIndex = selectedDrive;
}
else
{
toolStripComboBoxDrives.Items.Add(drive.Name);
_drives.Add(drive.Name, drive);
}
}
}
toolStripComboBoxDrives.SelectedIndex = selectedIndex;
}
}
基本的に私がやっていることは、Drive Watcher と呼ばれるフォーム読み込みイベントです。そのため、ディスクが挿入されると、準備ができたディスクが最初にコンボ ボックスに表示され、ユーザーはドライブを簡単に取り出すことができます。