C# 或C++ 控制系统光驱弹出或关闭

[DllImport("winmm.dll")]
public static extern int mciSendString(string s1,string s2,int i1,int i2);
//关闭光驱
mciSendString ("set cdaudio door closed","",0,0);
//打开光驱
mciSendString ("set cdaudio door open","",0,0);

**********************************************************************************************

光驱弹出与关闭

using System.Runtime.InteropServices ;

[DllImport("winmm.dll")]
public static extern int mciSendString(string s1,string s2,int i1,int i2);
private void button1_Click(object sender, System.EventArgs e) {
mciSendString ("set cdaudio door open","",0,0);
}

private void button2_Click(object sender, System.EventArgs e) {
mciSendString ("set cdaudio door closed","",0,0);
}

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

如何在vc++控制光驱的弹出和关闭,

这个问题非常简单。

首先加入相应控件。

Project-->Add To Project-->Component and Controls-->Visual C++Components-->Windows Multimedia library

然后填加按钮的响应代码

开光驱:

mciSendString("Set cdAudio door open wait",NULL,0,NULL);

关光驱:

mciSendString("Set cdAudio door closed wait",NULL,0,NULL);

**********************************************************************************************

控制光驱的弹出和关闭
2009-06-28 15:51

 

编程思路

利用API函数中的mciSendString()函数可以控制光驱的弹出与关闭。

mciSendString()函数

声明:Declare integer mciSendString in winmm.dll string lpstrCommand ,string@ lpstrReturnString, integer uReturnLength ,integer hwndCallback

语法:mciSendString(lpszCommand, @lpszReturnString, cchReturn, hwndCallback)

参数:lpszCommand:一个MCI命令字符串。

lpszReturnString:指定一个缓冲区用于接收返回信息,如果不需要返回信息,该参数可以为NULL。

cchReturn:lpszReturnString参数所指定缓冲区的长度(以字符为单位)。

hwndCallback:如果在命令字符串中指定了“notify”标志,该参数为回调窗口的句柄。

返回值:执行成功返回0,否则表示执行失败。

 

设计步骤

1、新建一个项目文件,创建一个新表单,名称为“控件光驱的弹出和关闭”。

2、在表单中添加Command控件。

3、程序代码:

在表单的Load事件中添加以下代码:

Declare integer mciSendString in winmm.dll string lpstrCommand ,string@ lpstrReturnString,;

integer uReturnLength ,integer hwndCallback

set library to "foxtools.fll"

 

在Command1控件的Click事件中添加以下代码:

myval=mciSendString("set CDAudio door open" ,NULL,0,0) &&打开光驱

IF myval<>0

MESSAGEBOX("打开光驱发生错误!",48,"系统提示")

ENDIF

 

在Command2控件的Click事件中添加以下代码:

myval=mciSendString("set CDAudio door closed" ,NULL,0,0) &&关闭光驱

IF myval<>0

MESSAGEBOX("关闭光驱发生错误!",48,"系统提示")

ENDIF

 

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

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);

posted @ 2011-11-13 18:10  @#¥%……  阅读(1720)  评论(0编辑  收藏  举报