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;
}
#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;
}
呵呵,但是程序知道吗?
你怎么知道程序就一定不知道呢?
在头文件中声明 消息处理函数
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData );
在实现文件中加入消息映射.
ON_MESSAGE(WM_DEVICECHANGE,OnDeviceChange)
to happydeer(乖乖小鹿)
用眼睛看一下,再同时按F11和F12,不但程序知道了。
就连MicroSoft的暗门都知道了。 :-)
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,有软盘插入。