gpt4 book ai didi

c# - 在驱动器 c# 中检测 dvd 插入的最佳方法

转载 作者:太空宇宙 更新时间:2023-11-03 21:47:29 25 4
gpt4 key购买 nike

我尝试使用 WMI 使用以下代码检测磁盘驱动器中的新媒体插入。但是是否有托管解决方案,例如在 DriveInfo.GetDrives 的后台线程中使用循环?哪种方法最好?当我尝试以下代码时,我在其他电脑上收到“磁盘不在驱动器中请插入磁盘”对话框和中止、重试并继续按钮?在可能的机器上它工作正常。

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 的表单加载事件上。因此,当插入磁盘时,准备好的磁盘将首先列在组合框中,用户可以轻松弹出驱动器。

最佳答案

你可以试试这些代码:

public void networkDevice()
{
try
{
WqlEventQuery q = new WqlEventQuery();
q.EventClassName = "__InstanceModificationEvent";
q.WithinInterval = new TimeSpan(0, 0, 1);
q.Condition = @"TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.DriveType = 5";

ConnectionOptions opt = new ConnectionOptions();
opt.EnablePrivileges = true;
opt.Authority = null;
opt.Authentication = AuthenticationLevel.Default;
//opt.Username = "Administrator";
//opt.Password = "";
ManagementScope scope = new ManagementScope("\\root\\CIMV2", opt);

ManagementEventWatcher watcher = new ManagementEventWatcher(scope, q);
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Start();
}
catch (ManagementException e)
{
Console.WriteLine(e.Message);
}
}

void watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject wmiDevice = (ManagementBaseObject)e.NewEvent["TargetInstance"];
string driveName = (string)wmiDevice["DeviceID"];
Console.WriteLine(driveName);
Console.WriteLine(wmiDevice.Properties["VolumeName"].Value);
Console.WriteLine((string)wmiDevice["Name"]);
if (wmiDevice.Properties["VolumeName"].Value != null)
Console.WriteLine("CD has been inserted");
else
Console.WriteLine("CD has been ejected");
}

如果它可以在您的机器上运行而不能在任何其他基于窗口的机器上运行,那么您必须重建/修复/重新注册该机器的 WMI 类。 This将在这方面帮助您。

关于c# - 在驱动器 c# 中检测 dvd 插入的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16207628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com