请问大家,如何用一个按钮控制打开和关闭光驱,
我编了一个函数DiskIsReady(),用MCI_STATUS_READY来进行查询,
但只能查询到光驱里有没有盘,而不能查询到光驱状态,从而控制
光驱,另外WM_DEVICECHANGE消息也只能在光驱状态改变时才能查询。
不知如何是好?

解决方案 »

  1.   

    void CToolsDlg::OnOutCdrom() 
    {
    mciSendString( "set cdaudio door open", NULL, 0, NULL);
    /* MCIDEVICEID mciID;
    MCI_OPEN_PARMS OpenParms;
    OpenParms.lpstrDeviceType = "cdaudio"; //光驱的设备名
    mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE,(DWORD) &OpenParms); //打开此设备
    mciID = mciGetDeviceID(OpenParms.lpstrDeviceType); //得到设备ID
    mciSendCommand(mciID, MCI_SET, MCI_WAIT | MCI_SET_DOOR_OPEN, NULL); //打开光驱门
    */
    }void CToolsDlg::OnInCdrom() 
    {
    mciSendString( "set cdaudio door closed", NULL, 0, NULL);
    /* MCIDEVICEID mciID;
    MCI_OPEN_PARMS OpenParms;
    OpenParms.lpstrDeviceType = "cdaudio";
    mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE,(DWORD) &OpenParms);
    mciID = mciGetDeviceID(OpenParms.lpstrDeviceType);
    mciSendCommand(mciID, MCI_SET, MCI_WAIT | MCI_SET_DOOR_CLOSED, NULL);
    */
    }
      

  2.   

    see the links below :http://www.codeproject.com/audio/mp3player.asp
      

  3.   

    To qing_li73
    看过了,没有帮助。
    大家再帮帮我吧,多谢!
      

  4.   

    void CToolsDlg::OnOutCdrom() 
    {
    mciSendString( "set cdaudio door open", NULL, 0, NULL);
    /* MCIDEVICEID mciID;
    MCI_OPEN_PARMS OpenParms;
    OpenParms.lpstrDeviceType = "cdaudio"; //光驱的设备名
    mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE,(DWORD) &OpenParms); //打开此设备
    mciID = mciGetDeviceID(OpenParms.lpstrDeviceType); //得到设备ID
    mciSendCommand(mciID, MCI_SET, MCI_WAIT | MCI_SET_DOOR_OPEN, NULL); //打开光驱门
    */
    }void CToolsDlg::OnInCdrom() 
    {
    mciSendString( "set cdaudio door closed", NULL, 0, NULL);
    /* MCIDEVICEID mciID;
    MCI_OPEN_PARMS OpenParms;
    OpenParms.lpstrDeviceType = "cdaudio";
    mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE,(DWORD) &OpenParms);
    mciID = mciGetDeviceID(OpenParms.lpstrDeviceType);
    mciSendCommand(mciID, MCI_SET, MCI_WAIT | MCI_SET_DOOR_CLOSED, NULL);
    */
    }
      

  5.   

    首先向工和中加入组件。选择“Project/Add to Project/Components and Controls”菜单项,在弹出的Components and Controls Gallery对话框中选择Visual C++ Componets文件夹中,然后选Windows
    Multimedia library项,按Insert按钮。在之后的消息框按“是”。这样,在工程中加入多媒体组件,在
    stdafx.h文件中加入了两体语句:
        #include <MMSystem.h>
        #pragma comment(lib,"wimm.lib")
       然后分别为IDC_OPENCDROM和IDC_OPENCLOSECDROM按钮添加BN_CLICKED消息处理函数如下:
       void CControlDlg::OnOpencdrom()  //打开光驱
       {
         mciSendString ("Set cdAudio door open wait",NULL,0,NULL);
        }
       void CControlDlg::OnOpencdrom()  //关闭光驱
       {
         mciSendString ("Set cdAudio door closed wait",NULL,0,NULL);
        }
     
      

  6.   

    http://www.vckbase.com/bbs/prime/viewprime.asp?id=388
      

  7.   

    他已经发布到我们局域网上,大家使用了,和他联系把  [email protected]
      

  8.   

    CMciDevice::GetStatus(StatusReady); 可以呀
      

  9.   

    DWORD CMciDevice::GetStatus(DWORD dwItem) {
    MCI_STATUS_PARMS mciStatusParms;
    mciStatusParms.dwCallback = (DWORD) m_hMainWnd;
    mciStatusParms.dwItem = dwItem;
    mciStatusParms.dwReturn = 0;

    SendCommand(MCI_STATUS, MCI_STATUS_ITEM, (DWORD) &mciStatusParms);

    return mciStatusParms.dwReturn;
    }
      

  10.   

    const DWORD CMciDevice::StatusReady = MCI_STATUS_READY;
      

  11.   

    To freelove1():
    首先多谢你回答我的问题:
    但是,你的方法只能判断光驱里有没有光盘,而
    不能判断光驱的任何时候的状态。
      

  12.   

    MCI_OPEN
    The MCI_OPEN command initializes a device or file. All devices recognize this command.To send this command, call the mciSendCommand function with the following parameters.MCIERROR mciSendCommand(
      MCIDEVICEID wDeviceID, 
      MCI_OPEN, 
      DWORD dwFlags, 
      (DWORD) (LPMCI_OPEN_PARMS) lpOpen
    );MCI_CLOSE
    The MCI_CLOSE command releases access to a device or file. All devices recognize this command.To send this command, call the mciSendCommand function with the following parameters.MCIERROR mciSendCommand(
      MCIDEVICEID wDeviceID, 
      MCI_CLOSE, 
      DWORD dwFlags, 
      (DWORD) (LPMCI_GENERIC_PARMS) lpClose
    );
      

  13.   

    http://www.codeguru.com/system/cdr.html
      

  14.   

    http://www.codeguru.com/system/cdr.html
    值得看看,我让看看能不能。多谢大家。
      

  15.   

    MCI_STATUS_READY
    真的可以判断光驱状态吗,
    但我试过,只能判断光驱里有没有光盘。
    而不能判断光驱的状态,不知大家有没有试过。
      

  16.   

    自己记录状态,如果手动弹出(或关闭)光驱,必须两次按钮才行。
    你不信,试试mediaplay或win2000下的cd player.它们也一样.
    好象没有有效的方法查到光驱弹出状态,我也查了好长时间.
      

  17.   

    写一个资源文件,然后定义按纽的ID然后在消息处理部分加入ID的处理部分可以用下面的函数处理
    void DoOpen(){     mciSendStringA("set cdaudio door open", NULL, 0, NULL);
    }
    ///////////////////////////////////////
    void DoClose(){
        mciSendStringA("set cdaudio door closed" ,NULL,0,NULL);}如果用VC需要这样在文件头部分加入如下声明#include <mmsystem.h>
    #pragma comment(lib, "winmm.lib")如果是GCC就需要在编译行-l libmm.lib了