在C#中如何判断光驱中是否有盘,如何得到光驱的盘符,如何弹出光

来源:岁月联盟 编辑:zhu 时间:2008-10-24
using System;
using System.Text;
using System.Runtime.InteropServices;

class CloseCD
{

[DllImport( "winmm.dll", EntryPoint="mciSendStringA", CharSet=CharSet.Ansi )]
protected static extern int mciSendString( string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, IntPtr hwndCallback );

public static void Main()
{

int ret = mciSendString( "set cdaudio door open", null, 0, IntPtr.Zero );

Console.ReadLine();

ret = mciSendString( "set cdaudio door closed", null, 0, IntPtr.Zero );
}
}

-----------------------------------------------------------------------------------------------------------------------------------

用API
GetDriveType 得到盘符
返回值为5即为光驱

用DirectoryInfo读取得到的盘符的内容,即可判断是否有盘

打开或者弹出
mciSendString("set CDAudio door open", returnstring, 127, 0)
mciSendString("set CDAudio door closed", returnstring, 127, 0)

-----------------------------------------------------------------------------------------------------------------------------------

使用WMI获取驱动器列表

using System.Management;

SelectQuery query =
new SelectQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3");

ManagementObjectSearcher searcher =
new ManagementObjectSearcher(query);

foreach (ManagementBaseObject envVar in searcher.Get())
{
this.listBox1.Items.Add(envVar["Name"].ToString());
}
如果查询语句中的DriveType 为2,会得到软驱,如果为5,会得到光驱。

-----------------------------------------------------------------------------------------------------------------------------------

再写一个API获取光驱名和判断有无光盘的方法:
string s ="";
StringBuilder volumeName = new StringBuilder(256);
int srNum = new int();
int comLen = new int();
string sysName = "";
int sysFlags = new int();
int result;
string [] logDrives = System.IO.Directory.GetLogicalDrives();
for(int i=0;i<logDrives.Length;i++)
{
if(api.GetDriveType(logDrives[i])==5)
{
s+="Your CD ROM is on drive : "+logDrives[i].ToString()+"/n";
result = api.GetVolumeInformation(logDrives[i].ToString(),volumeName,256,srNum,comLen,sysFlags,sysName,256);
if(result==0)
s+="CD ROM中没光盘";//不必用try,catch吧
else
{
s+="CD ROM 中有光盘,名称: " + volumeName;
}
}
}
label1.Text=s;
--------------------------------------------------------------------
打开光驱:
api.mciSendString("set CDAudio door open",null, 127, 0);
关闭光驱:
api.mciSendString("set CDAudio door closed",null, 127, 0);
----------------------------------------------------------------------------------------
类api中:
[DllImport("winmm.dll", EntryPoint="mciSendStringA")]
public static extern int mciSendString (string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
[DllImport("kernel32.dll", EntryPoint="GetVolumeInformationA")]
public static extern int GetVolumeInformation (string lpRootPathName,StringBuilder lpVolumeNameBuffer, int nVolumeNameSize, int lpVolumeSerialNumber, int lpMaximumComponentLength, int lpFileSystemFlags, string lpFileSystemNameBuffer, int nFileSystemNameSize);
[DllImport("kernel32.dll", EntryPoint="GetDriveTypeA")]
public static extern int GetDriveType (string nDrive);

-----------------------------------------------------------------------------------------------------------------------------------