好像不一定非要用汇编的windows 通过WM_DEVICECHANGE 来发送当前的CDRom开关状态,映射消息函数就可以了:
#include <dbt.h>
BOOL CMainFrame::OnDeviceChange(UINT nEventType, DWORD dwData)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwData;
switch(nEventType)

case DBT_DEVICEARRIVAL:     //设备准备好
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) 
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags & DBTF_MEDIA)
AfxMessageBox ("CDROM已关闭"); 
}
break;
case DBT_DEVICEREMOVECOMPLETE:    //设备未准备好
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME) 
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags & DBTF_MEDIA)
AfxMessageBox ("CDROM打开"); 

break; 

return TRUE;
}

解决方案 »

  1.   

    我不想通过消息~~要是在CDROM开门后我的程序才运行该怎么办呢?
    似乎只有通过ASM检测。
      

  2.   

    我要的是这个效果(简化的说):
    程序实现开关CDROM的功能,
    WinMain()
    {
        检测门是否开着;
        if(门开着)
             CloseDoor();
        else
             EjectDoor();
        return 0;
    }
    注意程序执行完CloseDoor();或EjectDoor();函数后就会退出。我下去试试你说的主动发一条消息...
      

  3.   

    我是在Dialog中用。
    还有,如何在运行程序的时候主动发送一条消息?
      

  4.   

    //检测光驱内是否有光盘或者光驱是否准备好
    BOOL IsDiscReady()
    {
    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;
    }
      

  5.   

    //检测光驱内是否有光盘或者光驱是否准备好太简单了。
    // 假设G盘时光区。
    BOOL IsDiscReady()
    {
    return GetVolumeInformation( _T("G:\\"),NULL,0,NULL,NULL,NULL,NULL,0);
    }
      

  6.   

    具我所知singlerace兄的方法也只能检查光取里是否有光盘,但并不能检查光驱到底是打开还是关闭的。这个问题值得关注!