首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

使用 C++ 控制光碟機開關:MCI 命令完整實作

     編輯:VC 教學

Windows 檔案總管僅提供「彈出」光碟機選單,缺少「關閉」功能。本文使用 MCI (Media Control Interface) 命令,實作程式化開啟/關閉光碟機托架,支援多光碟機批次操作。

核心函式:CD_OpenCloseDrive


#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。
  • 現代系統建議使用 IMAPI2 或 Windows Storage Management API 取代 MCI,但 MCI 相容性最廣(Win9x 至 Win11 均支援)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved