好像不一定非要用汇编的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;
}
似乎只有通过ASM检测。
程序实现开关CDROM的功能,
WinMain()
{
检测门是否开着;
if(门开着)
CloseDoor();
else
EjectDoor();
return 0;
}
注意程序执行完CloseDoor();或EjectDoor();函数后就会退出。我下去试试你说的主动发一条消息...
还有,如何在运行程序的时候主动发送一条消息?
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;
}
// 假设G盘时光区。
BOOL IsDiscReady()
{
return GetVolumeInformation( _T("G:\\"),NULL,0,NULL,NULL,NULL,NULL,0);
}