在驱动器c#中检测DVD插入的最佳方法但是有没有任何管理解决方案,比如在DriveInfo.GetDrives的后台线程中使用循环?哪种方法最好?当我尝试下面的代码时,我得到“磁盘不在驱动器中请插入磁盘”对话框中止,再试一次并在其他PC按钮上继续?在机器上它工作正常。privatevoidDriveWatcher(){try{varwqlEventQuery=newWqlEventQuery{EventClassName="__InstanceModificationEvent",WithinInterval=newTimeSpan(0,0,1),Condition=@"TargetInstanceISA'Win32_LogicalDisk'andTargetInstance.DriveType=5"};varconnectionOptions=newConnectionOptions{EnablePrivileges=true,Authority=null,Authentication=AuthenticationLevel.Default};varmanagementScope=newManagementScope("\root\CIMV2",connectionOptions);ManagementEventWatcher=newManagementEventWatcher(managementScope,wqlEventQuery);ManagementEventWatcher.EventArrived+=CdrEventArrived;ManagementEventWatcher.Start();}catch(ManagementExceptione){MessageBox.Show(e.Message,e.GetType().ToString(),MessageBoxButtons.OK,MessageBoxIcon.Error);}}privatevoidCdrEventArrived(objectsender,EventArrivedEventArgse){varwmiDevice=(ManagementBaseObject)e.NewEvent["TargetInstance"];如果(wmiDevice.Properties["VolumeName"].Value!=null)GetDrives();否则获取驱动器();}privatevoidGetDrives(){if(InvokeRequired){调用(newGetDrivesDelegate(GetDrives));}else{toolStripComboBoxDrives.Items.Clear();DriveInfo[]drives=DriveInfo.GetDrives();_drives=新字典();intselectedIndex=0;foreach(DriveInfodriveindrives){if(drive.DriveType.Equals(DriveType.CDRom)){if(drive.IsReady){stringname=string.Format(“{0}({1})”,drive.VolumeLabel,drive.Name.Substring(0,2));intselectedDrive=toolStripComboBoxDrives.Items.Add(名称);_drives.Add(名称,驱动器);selectedIndex=selectedDrive;}else{toolStripComboBoxDrives.Items.Add(drive.Name);_drives.Add(驱动器名称,驱动器);}}}toolStripComboBoxDrives.SelectedIndex=selectedIndex;基本上我正在做的是关于名为DriveWatcher的表单加载事件,因此当插入磁盘时,准备好的磁盘首先列在组合框中,用户可以轻松弹出磁盘。你可以试试这些代码:publicvoidnetworkDevice(){try{WqlEventQueryq=newWqlEventQuery();q.EventClassName="__InstanceModificationEvent";q.WithinInterval=newTimeSpan(0,0,1);q.Condition=@"TargetInstanceISA'Win32_LogicalDisk'andTargetInstance.DriveType=5";ConnectionOptionsopt=newConnectionOptions();opt.EnablePrivileges=true;opt.Authority=null;opt.Authentication=AuthenticationLevel.Default;//opt.Username="管理员";//opt.Password="";ManagementScopescope=newManagementScope("\root\CIMV2",opt);ManagementEventWatcher观察者=newManagementEventWatcher(scope,q);watcher.EventArrived+=newEventArrivedEventHandler(watcher_EventArrived);观察者.Start();}catch(ManagementExceptione){Console.WriteLine(e.Message);}}voidwatcher_EventArrived(objectsender,EventArrivedEventArgse){ManagementBaseObjectwmiDevice=(ManagementBaseObject)e.NewEvent["TargetInstance"];字符串驱动器名称=(字符串)wmiDevice["设备ID"];Console.WriteLine(驱动器名称);Console.WriteLine(wmiDevice.Properties["VolumeName"].Value);Console.WriteLine((string)wmiDevice["名称"]);if(wmiDevice.Properties["VolumeName"].Value!=null)Console.WriteLine("CD已插入");elseConsole.WriteLine("CD已弹出");如果它在你的机器上工作而在任何其他机器上不起作用如果你在基于Windows的机器上工作,那么你必须重建/修复/重新注册该机器的WMI类,这将帮助你。参考如下代码:foreach(DriveInfo.GetDrives().Where(d=>d.DriveType==DriveType.CDRom))MessageBox.Show(drive.Name+""+drive.IsReady.ToString());参考链接:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/1ecb74cd-d193-40f5-9aa3-47a3c9adb4ea/堆栈链接:检测光盘是否在DVD驱动器中我将使用以下解决方案计划。这是一个100%托管的解决方案。它不使用WMI,但效果很好。内部类DriveWatcher{publicdelegatevoidOpticalDiskArrivedEventHandler(Objectsender,OpticalDiskArrivedEventArgse);//////获取或设置时间(以秒为单位),在驱动器观察器检查相对于上次检查发生的新媒体插入之前。///publicint间隔=1;私人定时器_driveTimer;私人字典_drives;私人布尔_haveDisk;//////插入或弹出新光盘时发生。///公共事件OpticalDiskArrivedEventHandlerOpticalDiskArrived;privatevoidOnOpticalDiskArrived(OpticalDiskArrivedEventArgse){OpticalDiskArrivedEventHandlerhandler=OpticalDiskArrived;如果(处理程序!=null)处理程序(这个,e);}publicvoidStart(){_drives=newDictionary();foreach(DriveInfodriveinDriveInfo.GetDrives().Where(driveInfo=>driveInfo.DriveType.Equals(DriveType.CDRom))){_drives.Add(drive.Name,drive.IsReady);}_driveTimer=新定时器{Interval=Interval*1000};_driveTimer.Elapsed+=DriveTimerOnElapsed;_driveTimer.Start();}publicvoidStop(){if(_driveTimer!=null){_driveTimer.Stop();_driveTimer.Dispose();}}privatevoidDriveTimerOnElapsed(objectsender,ElapsedEventArgselapsedEventArgs){if(!_haveDisk){try{_haveDisk=true;foreach(DriveInfodriveinfromdriveinDriveInfo.GetDrives()wheredrive.DriveType.Equals(DriveType.CDRom)where_drives.ContainsKey(drive.Name)where!_drives[drive.Name].Equals(drive.IsReady)选择驱动器){_drives[drive.Name]=drive.IsReady;OnOpticalDiskArrived(新的OpticalDiskArrivedEventArgs{Drive=drive});}}catch(Exception异常){Debug.Write(exception.Message);}最后{_haveDisk=false;}}}}内部类OpticalDiskArrivedEventArgs:EventArgs{publicDriveInfoDrive;}您可以按如下方式使用它以上就是C#学习教程:ThebestwaytodetecttheinsertionofDVDindrivec);driveWatcher.OpticalDiskArrived+=DriveWatcherOnOpticalDiskArrived;driveWatcher.Start();privatevoidDriveWatcherOnOpticalDiskArrived(objectsender,OpticalDiskArrivedEventArgse){MessageBox.Show(e.Drive.Name);请点击右侧联系管理员删除。如需转载请注明出处:
