see this :http://codeguru.earthweb.com/multimedia/cd_audio.shtml
只有使用API函数了,由于 CDdoor 函数自身包含了对异常错误的处理机制,因此这个程序的通用性很高,你可以把这段代码移植到你的程序中试一试。我的这段代码是用Visual Basic写的,你可以看看: Option Explicit '说明:CDdoor函数是安装WINDOWS时所自带的winmm.dll文件中包含的函数 Private Declare Function CDdoor Lib "winmm.dll" Alias "mciSendStringA" _ ( _ ByVal lpstrCommand As String, _ ByVal lpstrReturnString As String, _ ByVal uReturnLength As Long, _ ByVal hwndCallback As Long _ ) As Long'CDOpen用来标示光驱开与关的状态 Dim CDOpen As BooleanPrivate Sub Command1_Click() On Error Resume Next'如果关闭则打开,并且按钮做相应变化 If CDOpen = False Then Call CDdoor("set CDAudio door open", 0, 0, 0) CDOpen = True Command1.Caption = "点击关闭光驱" Else '否则关闭 Call CDdoor("set CDAudio door closed", 0, 0, 0) CDOpen = False Command1.Caption = "点击打开光驱" End If End SubPrivate Sub Form_Load() CDOpen = False Call CDdoor("set CDAudio door closed", 0, 0, 0) End Sub CDdoor函数是安装WINDOWS时所自带的winmm.dll文件中包含的函数,我们只须先加入如下的声明后就能引用这个API函数: Private Declare Function CDdoor Lib "winmm.dll" Alias "mciSendStringA" _ ( _ ByVal lpstrCommand As String, _ String,这是控制命令参数 ByVal lpstrReturnString As String, _ String,这是返回值 ByVal uReturnLength As Long, _ Long,返回值长度参数 ByVal hwndCallback As Long _ ) As Long 引用的语法是:Call CDdoor("set CDAudio door closed", 0, 0, 0) 用以关闭光驱门 Call CDdoor("set CDAudio door open", 0, 0, 0) 用以打开光驱门 如果配合检测光驱是否存在的函数一起使用,此程序的通用性会更高。检测驱动器信息的函数GetDriveType,GetLogicalDrives的具体用法你查一下Windows API 手册吧。我也记不起来了。
Option Explicit
'说明:CDdoor函数是安装WINDOWS时所自带的winmm.dll文件中包含的函数
Private Declare Function CDdoor Lib "winmm.dll" Alias "mciSendStringA" _
( _
ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, _
ByVal hwndCallback As Long _
) As Long'CDOpen用来标示光驱开与关的状态
Dim CDOpen As BooleanPrivate Sub Command1_Click()
On Error Resume Next'如果关闭则打开,并且按钮做相应变化
If CDOpen = False Then
Call CDdoor("set CDAudio door open", 0, 0, 0)
CDOpen = True
Command1.Caption = "点击关闭光驱"
Else
'否则关闭
Call CDdoor("set CDAudio door closed", 0, 0, 0)
CDOpen = False
Command1.Caption = "点击打开光驱"
End If
End SubPrivate Sub Form_Load()
CDOpen = False
Call CDdoor("set CDAudio door closed", 0, 0, 0)
End Sub
CDdoor函数是安装WINDOWS时所自带的winmm.dll文件中包含的函数,我们只须先加入如下的声明后就能引用这个API函数:
Private Declare Function CDdoor Lib "winmm.dll" Alias "mciSendStringA" _
( _
ByVal lpstrCommand As String, _ String,这是控制命令参数
ByVal lpstrReturnString As String, _ String,这是返回值
ByVal uReturnLength As Long, _ Long,返回值长度参数
ByVal hwndCallback As Long _
) As Long 引用的语法是:Call CDdoor("set CDAudio door closed", 0, 0, 0) 用以关闭光驱门 Call CDdoor("set CDAudio door open", 0, 0, 0) 用以打开光驱门 如果配合检测光驱是否存在的函数一起使用,此程序的通用性会更高。检测驱动器信息的函数GetDriveType,GetLogicalDrives的具体用法你查一下Windows API 手册吧。我也记不起来了。
MCI_STATUS_PARMS mciStatusParms;
mciStatusParms.dwCallback=(DWORD)GetSafeHwnd();
mciStatusParms.dwItem=MCI_STATUS_READY ;
mciStatusParms.dwReturn=0;
mciSendCommand(MCI_DEVTYPE_CD_AUDIO,
MCI_STATUS,
MCI_STATUS_ITEM,
(DWORD)&mciStatusParms);
return mciStatusParms.dwReturn;
以上这段代码只能判断光盘有没有,而不能判断光驱状态
而WM_DEVICE_CHANGE消息也只能判断在光驱改变时的光驱状态。请大家再帮帮我想想吧!
#pragma comment(lib,"winmm.lib")
然后分别为IDC_OPENCDROM和IDC_CLOSECDROM按钮添加BN_CLICKED消息处理函数:
void YourClass::OnOpencdrom()
{
mciSendString("Set cdAudio door open wait",NULL,0,NULL);
//.....改变光驱状态BOOL变量的值
}//打开光驱
void YourClass::OnClosecdrom()
{
mceSendString("Set cdAudio door closed wait",NULL,0,NULL);
//.....改变光驱状态BOOL变量的值
}//关闭光驱
你可以在设置两BOOL变量和按钮对应的打开光驱(ID_OPENCDROM)和关闭光驱(ID_CLOSECDROM)关联,在初始化时分别设置为TRUE,FALSE,这样通过使菜单变灰来控制光驱,也可根据BOOL变量的值来判断光驱是打开还是关闭的。
添加消息响应函数。
void YourClass::OnClosecomputer()
{
HINSTANCE hInstance = LoadLibrary("shell32.dll");
SHUT Shut;//指向关机对话框函数的指针
if(hInstance!=NULL)
{
m_Shut = (SHUT)GetProcAddress(hInstance,(LPSTR)60);//(*Shut)(0);
}
}
//该函数是通过shell32.dll中索引号为60的API函数调用来实现该功能的。
首先多谢您的回答,但是我只想用我一个按钮来控制光驱,
您没有考虑一些情况。例如,如果用户手动按了光驱按钮,
那么布尔值是毫无用处的,其二是,当您的程序刚启动之时,
您根本不知光驱的状态,如何去设置布尔值呢,没有理由一
启动就关闭别人的光驱来方便自己的初始化吧!
OnDeviceChange()这个函数只要您发打开或关闭光驱指令或
用户按下光驱按钮之时都会触发,但就不知如何来捕捉光驱
的状态,以控制光驱。
当OnDeviceChange()函数触发之时,是可以判断光驱状态,
但就不知如何做,我曾尝试用SendMessage()来发送
ON_WM_DEVICECHANGE消息,但是程序一接收到此消息就发生错误,
说是不能访问静态地址。
唉,真不知怎办。
ARCILL,你的心情我也曾有过,我在好多论坛上发过类似问题,可一直无法解决,真可谓同病相怜!
http://expert.csdn.net/Expert/topic/1096/1096384.xml?temp=.2923395
请大家帮帮我吧!
希望高手快来
让我们这些新手多学东西
楼主加油
我up..up...up....
:)
// 如下的应用程序代码中只需这么控制
// 完整的CMciMuster类稍后贴出,另 CWaveWnd 派生自 CMciMuster;BOOL CWaveWnd::OpenCDTheDoor()
{
try
{
mciOpen(MCI_OPEN_TYPE, DEVTYPE_CD, NULL);
mciSet(MCI_SET_DOOR_OPEN | MCI_NOTIFY, NULL, NULL);
mciClose(NULL);
}
catch(char * psz)
{
AfxMessageBox(GetSafeString(psz));
return FALSE;
}
return TRUE;
}BOOL CWaveWnd::CloseCDTheDoor()
{
try
{
mciOpen(MCI_OPEN_TYPE, DEVTYPE_CD, NULL);
mciSet(MCI_SET_DOOR_CLOSED | MCI_NOTIFY, NULL, NULL);
mciClose(NULL);
}
catch(char * psz)
{
AfxMessageBox(GetSafeString(psz));
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////
#define DEVTYPE_WAVE _T("WaveAudio")
#define DEVTYPE_CD _T("CDAudio")
#define DEVTYPE_AVI _T("AVIAudio")
#define DEVTYPE_SEQUENCER _T("Sequencer") // 音序///////////////////////////////////////////////////////////////////////
//
// MCI 接口,多媒体操作
//class CMciMuster
{
public:
CMciMuster(HWND hwnd = NULL);
virtual ~CMciMuster();protected: // 所关联的窗口句柄.
// 当dwFlags参数包含有MCI_NOTIFY参数时(待所持有的操作结束)
// 会向此窗口发送MM_MCINOTIFY消息 HWND m_cbHwnd;
MCIDEVICEID m_hObject;
MCI_INLINE VOID CommProc(){ ASSERT(m_hObject != NULL);}
MCI_INLINE VOID HoldProc(){} public:
operator MCIDEVICEID(){ return m_hObject;}
MCI_INLINE VOID mciGetLastError(VOID);
public:
MCI_INLINE BOOL _SetTimeFromat(DWORD dwTimeFromat, DWORD dwAudio = NULL);
// MCI_BREAK
BOOL mciBreak(DWORD dwFlags, int nVirtKey, HWND hwndBreak);
// MCI_CAPTURE
BOOL mciCapture(DWORD dwFlags, LPSTR lpstrFileName,
const RECT &rc);
// MCI_CLOSE
BOOL mciClose(DWORD dwFlags);
// MCI_CONFIGURE
BOOL mciConfigure(DWORD dwFlags);
// MCI_COPY
BOOL mciCopy(DWORD dwFlags, DWORD dwFrom, DWORD dwTo,
const RECT &rc, DWORD dwAudioStream, DWORD dwVideoStream);
// MCI_CUE
BOOL mciCues(DWORD dwFlags);
// MCI_CUT
BOOL mciCut(DWORD dwFlags, DWORD dwFrom, DWORD dwTo,
const RECT &rc, DWORD dwAudioStream, DWORD dwVideoStream);
// MCI_DELETE
BOOL mciDelete(DWORD dwFlags);
// MCI_ESCAPE
BOOL mciEscape(DWORD dwFlags, LPCSTR lpstrCommand);
// MCI_FREEZE
BOOL mciFreeze(DWORD dwFlags, LPCSTR lpstrCommand);
// MCI_GETDEVCAPS
BOOL mciGetDevcaps(DWORD dwFlags, DWORD dwReturn, DWORD dwItem);
// MCI_INFO
BOOL mciIndex(DWORD dwFlags, LPSTR lpstrReturn,
DWORD dwRetSize);
// MCI_LIST
BOOL mciList(DWORD dwFlags);
// MCI_LOAD
BOOL mciLoad(DWORD dwFlags, LPSTR lpfileName);
// MCI_MONITOR
BOOL mciMonitor(DWORD dwFlags, DWORD dwSource,
DWORD dwMethod);
// MCI_OPEN
BOOL mciOpen(DWORD dwFlags, LPCSTR lpstrDeviceType,
LPCSTR lpstrElementName, LPCSTR lpstrAlias = NULL);
// MCI_PASTE
BOOL mciPaste(DWORD dwFlags, DWORD dwTo,
const RECT &rc, DWORD dwAudioStream, DWORD dwVideoStream);
// MCI_PAUSE
BOOL mciPause(DWORD dwFlags);
// MCI_PLAY
BOOL mciPlay(DWORD dwFlags, DWORD dwFrom, DWORD dwTo);
// MCI_PUT
BOOL mciPut(DWORD dwFlags);
// MCI_QUALITY
BOOL mciQuality(DWORD dwFlags, DWORD dwItem,
LPSTR lpstrName, DWORD lpstrAlgorithm, DWORD dwHandle);
// MCI_REALIZE
BOOL mciRealize(DWORD dwFlags);
// MCI_RECORD
BOOL mciRecord(DWORD dwFlags, DWORD dwFrom, DWORD dwTo);
// MCI_RESERVE
BOOL mciReserve(DWORD dwFlags, LPSTR lpstrPath,
DWORD dwSize);
// MCI_RESTORE
BOOL mciRestore(DWORD dwFlags, LPSTR lpstrFileName,
const RECT &rc);
// MCI_RESUME
BOOL mciResume(DWORD dwFlags);
// MCI_SAVE
BOOL mciSave(DWORD dwFlags, LPCSTR lpszFileName);
// MCI_SEEK
BOOL mciSeek(DWORD dwFlags, DWORD dwTo);
// MCI_SET
BOOL mciSet(DWORD dwFlags, DWORD dwTimeFormat,
DWORD dwAudio);
// MCI_SETAUDIO
BOOL mciSetAudio(DWORD dwFlags);
// MCI_SETTUNER
BOOL mciSetTuner(DWORD dwFlags, DWORD dwChannel,
DWORD dwNumber);
// MCI_SETVIDEO
BOOL mciSetVideo(DWORD dwFlags);
// MCI_SIGNAL
BOOL mciSignal(DWORD dwFlags, DWORD dwPosition,
DWORD dwPeriod, DWORD dwUserParm);
// MCI_SPIN
BOOL mciSpin(DWORD dwFlags);
// MCI_STATUS
BOOL mciSetStatus(DWORD dwFlags, DWORD dwReturn,
DWORD dwItem, DWORD dwTrack);
// MCI_STEP
BOOL mciStep(DWORD dwFlags);
// MCI_STOP
BOOL mciStop(DWORD dwFlags);
// MCI_SYSINFO
BOOL mciSysInfo(DWORD dwFlags, LPSTR lpstrReturn,
DWORD dwRetSize, DWORD dwNumber, UINT wDeviceType);
// MCI_UNDO
BOOL mciUndo(DWORD dwFlags);
// MCI_UNFREEZE
BOOL mciUnFreeze(DWORD dwFlags);
// MCI_UPDATE
BOOL mciUpdate(DWORD dwFlags);
// MCI_WHERE
BOOL mciWhere(DWORD dwFlags);
// MCI_WINDOW
BOOL mciWindow(DWORD dwFlags);
};
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "MciMuster.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CMciMuster::CMciMuster(HWND hwnd/*=NULL*/)
{
m_hObject = NULL;
m_cbHwnd = hwnd;
}CMciMuster::~CMciMuster()
{
if(m_hObject) mciClose(MCI_NOTIFY);
}////////////////////////////////////////////////////////////////////////
//MCI_INLINE VOID CMciMuster::mciGetLastError(VOID)
{
TCHAR pszText[128];
DWORD dwError = ::mciGetErrorString(
m_hObject,
pszText,
strlen(pszText) + 1);
if(dwError) MCI_THROW(pszText);
}
// MCI_BREAK
MCI_INLINE CMciMuster:: mciBreak(DWORD dwFlags, int nVirtKey, HWND hwndBreak)
{
CommProc();
MCI_BREAK_PARMS params;
memset(¶ms, 0, sizeof(params)); params.dwCallback = (DWORD)(LPVOID)m_cbHwnd;
params.hwndBreak = hwndBreak;
params.nVirtKey = nVirtKey; HoldProc();
if(::mciSendCommand(m_hObject, MCI_BREAK, dwFlags,
(DWORD)(LPMCI_BREAK_PARMS)¶ms) != 0)
{
mciGetLastError();
return FALSE;
}
return TRUE;
}
// MCI_CAPTURE
MCI_INLINE CMciMuster:: mciCapture(DWORD dwFlags, LPSTR lpstrFileName, const RECT &rc)
{
CommProc();
MCI_DGV_CAPTURE_PARMS params;
memset(¶ms, 0, sizeof(params)); params.dwCallback = (DWORD)(LPVOID)m_cbHwnd;
params.lpstrFileName = lpstrFileName;
params.rc = rc; HoldProc();
if(::mciSendCommand(m_hObject, MCI_BREAK, dwFlags,
(DWORD)(LPMCI_DGV_CAPTURE_PARMS)¶ms) != 0)
{
mciGetLastError();
return FALSE;
}
return TRUE;
}
// MCI_CLOSE
MCI_INLINE CMciMuster:: mciClose(DWORD dwFlags)
{
CommProc();
MCI_GENERIC_PARMS params;
memset(¶ms, 0, sizeof(params));
params.dwCallback = (DWORD)(LPVOID)m_cbHwnd; HoldProc();
if(::mciSendCommand(m_hObject, MCI_CLOSE, dwFlags,
(DWORD)(LPMCI_GENERIC_PARMS)¶ms) != 0)
{
mciGetLastError();
return FALSE;
}
m_hObject = NULL;
return TRUE;
}
// MCI_CONFIGURE
MCI_INLINE CMciMuster:: mciConfigure(DWORD dwFlags)
{
CommProc();
MCI_GENERIC_PARMS params;
memset(¶ms, 0, sizeof(params));
params.dwCallback = (DWORD)(LPVOID)m_cbHwnd; HoldProc();
if(::mciSendCommand(m_hObject, MCI_CONFIGURE, dwFlags,
(DWORD)(LPMCI_GENERIC_PARMS)¶ms) != 0)
{
mciGetLastError();
return FALSE;
}
return TRUE;
}
// MCI_COPY
MCI_INLINE CMciMuster:: mciCopy(DWORD dwFlags, DWORD dwFrom, DWORD dwTo,
const RECT &rc, DWORD dwAudioStream, DWORD dwVideoStream)
{
CommProc();
MCI_DGV_COPY_PARMS params;
memset(¶ms, 0, sizeof(params)); params.dwCallback = (DWORD)(LPVOID)m_cbHwnd;
params.dwAudioStream = dwAudioStream; // 音频流
params.dwVideoStream = dwVideoStream; // 视频流
params.dwFrom = dwFrom;
params.dwTo = dwTo;
params.rc = rc; HoldProc();
if(::mciSendCommand(m_hObject, MCI_COPY, dwFlags,
(DWORD)(LPMCI_DGV_COPY_PARMS)¶ms) != 0)
{
mciGetLastError();
return FALSE;
}
return TRUE;
}
// MCI_CUE
MCI_INLINE CMciMuster:: mciCues(DWORD dwFlags)
{
CommProc();
MCI_GENERIC_PARMS params;
memset(¶ms, 0, sizeof(params));
params.dwCallback = (DWORD)(LPVOID)m_cbHwnd; HoldProc();
if(::mciSendCommand(m_hObject, MCI_CUE, dwFlags,
(DWORD)(LPMCI_GENERIC_PARMS)¶ms) != 0)
{
mciGetLastError();
return FALSE;
}
return TRUE;
}
// MCI_CUT
MCI_INLINE CMciMuster:: mciCut(DWORD dwFlags, DWORD dwFrom, DWORD dwTo,
const RECT &rc, DWORD dwAudioStream, DWORD dwVideoStream)
{
CommProc();
MCI_DGV_CUT_PARMS params;
memset(¶ms, 0, sizeof(params)); params.dwCallback = (DWORD)(LPVOID)m_cbHwnd;
params.dwAudioStream = dwAudioStream; // 音频流
params.dwVideoStream = dwVideoStream; // 视频流
params.dwFrom = dwFrom;
params.dwTo = dwTo;
params.rc = rc; HoldProc();
if(::mciSendCommand(m_hObject, MCI_CUT, dwFlags,
(DWORD)(LPMCI_DGV_CUT_PARMS)¶ms) != 0)
{
mciGetLastError();
return FALSE;
}
return TRUE;
}
// MCI_DELETE
MCI_INLINE CMciMuster:: mciDelete(DWORD dwFlags)
{
CommProc();
MCI_GENERIC_PARMS params;
memset(¶ms, 0, sizeof(params));
params.dwCallback = (DWORD)(LPVOID)m_cbHwnd; HoldProc();
if(::mciSendCommand(m_hObject, MCI_DELETE, dwFlags,
(DWORD)(LPMCI_GENERIC_PARMS)¶ms) != 0)
{
mciGetLastError();
return FALSE;
}
return TRUE;
}
// MCI_ESCAPE
MCI_INLINE CMciMuster:: mciEscape(DWORD dwFlags, LPCSTR lpstrCommand)
{
CommProc();
MCI_VD_ESCAPE_PARMS params;
memset(¶ms, 0, sizeof(params)); params.dwCallback = (DWORD)(LPVOID)m_cbHwnd;
params.lpstrCommand = lpstrCommand; HoldProc();
if(::mciSendCommand(m_hObject, MCI_ESCAPE, dwFlags,
(DWORD)(LPMCI_VD_ESCAPE_PARMS)¶ms) != 0)
{
mciGetLastError();
return FALSE;
}
return TRUE;
}