Windows 檔案總管僅提供「彈出」光碟機選單,缺少「關閉」功能。本文使用 MCI (Media Control Interface) 命令,實作程式化開啟/關閉光碟機托架,支援多光碟機批次操作。
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
// bOpenDrive: true=開啟, false=關閉
// cDrive: 磁碟機代號 (如 'G'),或 1 表示第一個邏輯光碟機
void CD_OpenCloseDrive(BOOL bOpenDrive, TCHAR cDrive) {
MCI_OPEN_PARMS op = {0};
MCI_STATUS_PARMS st = {0};
DWORD flags;
TCHAR szDriveName[4] = _T("X:");
op.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_CD_AUDIO;
if (cDrive > 1) { // 指定磁碟機代號
szDriveName[0] = cDrive;
op.lpstrElementName = szDriveName;
flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE;
} else { // 使用第一個可用光碟機
flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE;
}
if (!mciSendCommand(0, MCI_OPEN, flags, (DWORD_PTR)&op)) {
st.dwItem = MCI_STATUS_READY;
if (bOpenDrive)
mciSendCommand(op.wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
else
mciSendCommand(op.wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
mciSendCommand(op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0);
}
}
void CD_OpenCloseAllDrives(BOOL bOpenDrives) {
TCHAR szDrive[4] = _T("?:\\");
DWORD dwDriveList = GetLogicalDrives();
int nPos = 0;
while (dwDriveList) {
if (dwDriveList & 1) {
szDrive[0] = _T('A') + nPos;
if (GetDriveType(szDrive) == DRIVE_CDROM)
CD_OpenCloseDrive(bOpenDrives, szDrive[0]);
}
dwDriveList >>= 1;
nPos++;
}
}
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
// 開啟 G: 光碟機
CD_OpenCloseDrive(TRUE, _T('G'));
// 關閉 G: 光碟機
CD_OpenCloseDrive(FALSE, _T('G'));
// 開啟所有光碟機
CD_OpenCloseAllDrives(TRUE);
// 關閉所有光碟機
CD_OpenCloseAllDrives(FALSE);
MCI_OPEN 開啟 CD 音訊裝置,取得裝置 ID (wDeviceID)。MCI_SET 配合 MCI_SET_DOOR_OPEN/MCI_SET_DOOR_CLOSED 控制托架馬達。MCI_CLOSE 釋放裝置控制權。GetLogicalDrives 位掃描所有邏輯磁碟機,GetDriveType 篩選 DRIVE_CDROM。MCI_SET_DOOR_CLOSED 無效果。MCI_STATUS_READY。