请问,不管光驱里有没有光盘,如何判断光驱是打开了还是关闭了;
如何捕捉用户选择关机的动作;
如何捕捉用户双击光驱图标或右击光驱图标选择打开的动作。
多谢了。

解决方案 »

  1.   

    see this :http://codeguru.earthweb.com/multimedia/cd_audio.shtml
      

  2.   

    只有使用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 手册吧。我也记不起来了。
     
      

  3.   

    响应WM_QUERYENDSESSION可以捕捉用户选择关机的动作
      

  4.   

    光驱还是控制不了,
    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消息也只能判断在光驱改变时的光驱状态。请大家再帮帮我想想吧!
      

  5.   

    在工程中加入多媒体组件,即在stdafx.h中加入#include "MMSystem.h"
    #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变量的值来判断光驱是打开还是关闭的。
      

  6.   

    typedef int (CALLBACK * SHUT) int按钮:关闭计算机(ID_CLOSECOMPUTER)
    添加消息响应函数。
    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函数调用来实现该功能的。      
      

  7.   

    To lblyy76(yibo)
    首先多谢您的回答,但是我只想用我一个按钮来控制光驱,
    您没有考虑一些情况。例如,如果用户手动按了光驱按钮,
    那么布尔值是毫无用处的,其二是,当您的程序刚启动之时,
    您根本不知光驱的状态,如何去设置布尔值呢,没有理由一
    启动就关闭别人的光驱来方便自己的初始化吧!
    OnDeviceChange()这个函数只要您发打开或关闭光驱指令或
    用户按下光驱按钮之时都会触发,但就不知如何来捕捉光驱
    的状态,以控制光驱。
    当OnDeviceChange()函数触发之时,是可以判断光驱状态,
    但就不知如何做,我曾尝试用SendMessage()来发送
    ON_WM_DEVICECHANGE消息,但是程序一接收到此消息就发生错误,
    说是不能访问静态地址。
    唉,真不知怎办。
      

  8.   

    OnDeviceChange()系统的广播消息,通过解析他,可以知道光驱的状态
      

  9.   

    WM_DEVICECHANGE消息只能是在光驱中有盘的情况下才会发送该消息,为了这个问题我也苦恼的好长日子,到现在还是没人能解决这个问题!
    ARCILL,你的心情我也曾有过,我在好多论坛上发过类似问题,可一直无法解决,真可谓同病相怜!
      

  10.   

    我已经发了两个贴子是问关于这个问题了,但还是没有得到很好的回答。
    http://expert.csdn.net/Expert/topic/1096/1096384.xml?temp=.2923395
    请大家帮帮我吧!
      

  11.   

    Cd-rom的控制器裡面保存有CD-rom的各種狀態,我記不清了,你可以查相關文檔,應該可以實現的.
      

  12.   

    强烈gz
    希望高手快来
    让我们这些新手多学东西
    楼主加油
    我up..up...up....
    :)
      

  13.   

    // 给你一个例子先,这是俺过去写的:
    // 如下的应用程序代码中只需这么控制
    // 完整的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;
    }
      

  14.   

    // CMicMuster类
    ////////////////////////////////////////////////////////////////////
    #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);
    };
      

  15.   

    // MciMuster.cpp: implementation of the CMciMuster class.
    //
    //////////////////////////////////////////////////////////////////////#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(&params, 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)&params) != 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(&params, 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)&params) != 0)
    {
    mciGetLastError();
    return FALSE;
    }
    return TRUE;
    }
    // MCI_CLOSE
    MCI_INLINE CMciMuster:: mciClose(DWORD dwFlags)
    {
    CommProc();
    MCI_GENERIC_PARMS params;
    memset(&params, 0, sizeof(params));
    params.dwCallback = (DWORD)(LPVOID)m_cbHwnd; HoldProc();
    if(::mciSendCommand(m_hObject, MCI_CLOSE, dwFlags, 
    (DWORD)(LPMCI_GENERIC_PARMS)&params) != 0)
    {
    mciGetLastError();
    return FALSE;
    }
    m_hObject = NULL;
    return TRUE;
    }
    // MCI_CONFIGURE
    MCI_INLINE CMciMuster:: mciConfigure(DWORD dwFlags)
    {
    CommProc();
    MCI_GENERIC_PARMS params;
    memset(&params, 0, sizeof(params));
    params.dwCallback = (DWORD)(LPVOID)m_cbHwnd; HoldProc();
    if(::mciSendCommand(m_hObject, MCI_CONFIGURE, dwFlags, 
    (DWORD)(LPMCI_GENERIC_PARMS)&params) != 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(&params, 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)&params) != 0)
    {
    mciGetLastError();
    return FALSE;
    }
    return TRUE;
    }
    // MCI_CUE
    MCI_INLINE CMciMuster:: mciCues(DWORD dwFlags)
    {
    CommProc();
    MCI_GENERIC_PARMS params;
    memset(&params, 0, sizeof(params));
    params.dwCallback = (DWORD)(LPVOID)m_cbHwnd; HoldProc();
    if(::mciSendCommand(m_hObject, MCI_CUE, dwFlags, 
    (DWORD)(LPMCI_GENERIC_PARMS)&params) != 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(&params, 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)&params) != 0)
    {
    mciGetLastError();
    return FALSE;
    }
    return TRUE;
    }
    // MCI_DELETE
    MCI_INLINE CMciMuster:: mciDelete(DWORD dwFlags)
    {
    CommProc();
    MCI_GENERIC_PARMS params;
    memset(&params, 0, sizeof(params));
    params.dwCallback = (DWORD)(LPVOID)m_cbHwnd; HoldProc();
    if(::mciSendCommand(m_hObject, MCI_DELETE, dwFlags, 
    (DWORD)(LPMCI_GENERIC_PARMS)&params) != 0)
    {
    mciGetLastError();
    return FALSE;
    }
    return TRUE;
    }
    // MCI_ESCAPE
    MCI_INLINE CMciMuster:: mciEscape(DWORD dwFlags, LPCSTR lpstrCommand)
    {
    CommProc();
    MCI_VD_ESCAPE_PARMS params;
    memset(&params, 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)&params) != 0)
    {
    mciGetLastError();
    return FALSE;
    }
    return TRUE;
    }