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.   

    to xf8zbf:
    呵呵,但是程序知道吗?
      

  2.   

    to Luck04():
    你怎么知道程序就一定不知道呢?
      

  3.   

    另外:WM_DEVICECHANGE在类向导中看不到,需要你手工加入。如下:
    在头文件中声明 消息处理函数
    afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData );
    在实现文件中加入消息映射.
    ON_MESSAGE(WM_DEVICECHANGE,OnDeviceChange)
      

  4.   

    to Luck04()
    to happydeer(乖乖小鹿) 
       用眼睛看一下,再同时按F11和F12,不但程序知道了。
    就连MicroSoft的暗门都知道了。   :-) 
      

  5.   

    但是WM_DEVICECHANGE只是在光驱开关的一瞬间才发送的,我想在程序一开始的时候就检查光驱的状态,有什么办法么?
      

  6.   

    这段代码是检查软盘的,你看看是不是能改一下去检查光驱。
    char    buf[10];
    HANDLE  hDevice = ::CreateFile("\\\\.\\a:", GENERIC_READ|GENERIC_WRITE,
    FILE_SHARE_READ|FILE_SHARE_WRITE,
    NULL,OPEN_EXISTING,
    0,NULL);
    if (hDevice != INVALID_HANDLE_VALUE)
    {
    int nret = DeviceIoControl(hDevice,IOCTL_STORAGE_CHECK_VERIFY,
    NULL,0,NULL, 0,(LPDWORD)buf,NULL);
    } // 注:nret=0,无软盘插入;nret=1,有软盘插入。
      

  7.   

    C Dis:http://www.csdn.net/expert/TopicView.asp?id=94442