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

C# 控制光碟機開關:mciSendString 開關光碟機托盤

     編輯:.NET 實例教學

核心 API

同播放音樂,使用 winmm.dll 的 mciSendString,指令針對 CDAudio 裝置。

完整程式碼


using System;
using System.Runtime.InteropServices;

public static class CdDriveControl
{
    [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
    private static extern int MciSendString(string command, StringBuilder returnValue, int returnLength, IntPtr callback);

    /// 
    /// 彈出光碟機托盤
    /// 
    public static void OpenTray(char driveLetter = 'D')
    {
        string cmd = $"set cdaudio drive {driveLetter} door open";
        int err = MciSendString(cmd, null, 0, IntPtr.Zero);
        if (err != 0) throw new InvalidOperationException($"MCI 開啟光碟機失敗: {err}, 指令: {cmd}");
    }

    /// 
    /// 關閉光碟機托盤
    /// 
    public static void CloseTray(char driveLetter = 'D')
    {
        string cmd = $"set cdaudio drive {driveLetter} door closed";
        int err = MciSendString(cmd, null, 0, IntPtr.Zero);
        if (err != 0) throw new InvalidOperationException($"MCI 關閉光碟機失敗: {err}, 指令: {cmd}");
    }

    /// 
    /// 切換托盤狀態
    /// 
    public static void ToggleTray(char driveLetter = 'D')
    {
        // MCI 無直接查詢門狀態指令,簡易做法:嘗試關閉,失敗則開啟 (或反之)
        // 更穩健請使用 DeviceIoControl IOCTL_STORAGE_CHECK_VERIFY2
        try { CloseTray(driveLetter); }
        catch { OpenTray(driveLetter); }
    }
}

使用範例


private void btnEject_Click(object sender, EventArgs e)
{
    try
    {
        CdDriveControl.OpenTray('E'); // 指定光碟機代號
        MessageBox.Show("光碟機已彈出");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"操作失敗: {ex.Message}");
    }
}

private void btnClose_Click(object sender, EventArgs e)
{
    CdDriveControl.CloseTray('E');
}

MCI CDAudio 指令速查

指令說明
set cdaudio drive D door open彈出 D 槽托盤
set cdaudio drive D door closed關閉 D 槽托盤
status cdaudio mode查詢狀態 (playing/paused/stopped/open)
play cdaudio from 1 to 10播放第 1 到 10 軌
pause cdaudio暫停播放
resume cdaudio繼續播放

注意事項

  • 磁碟機代號:預設 'D',實際請透過 DriveInfo.GetDrives() 篩選 DriveType.CDRom 確認。
  • 多光碟機:指令需指定 drive X,否則作用於系統預設 CDAudio 裝置。
  • 權限:標準使用者即可操作,無需管理員權限。
  • 筆記型電腦槽載式光碟機:無實體托盤,door open/closed 可能無效或報錯。
  • 虛擬光碟機 (Daemon Tools, Virtual CloneDrive):同樣回應 MCI 指令,可用於測試。

進階替代:DeviceIoControl (IOCTL_STORAGE_EJECT_MEDIA)

需更精確控制(如鎖定/解鎖托盤、偵測媒體是否存在)請使用 DeviceIoControl 搭配 IOCTL_STORAGE_EJECT_MEDIA、IOCTL_STORAGE_LOAD_MEDIA、IOCTL_STORAGE_CHECK_VERIFY2,屬較底層儲存體介面,程式碼較繁瑣但功能完整。

結語

幾行 mciSendString 即可完成光碟機開關控制,適合簡單工具專案。記住指定正確磁碟機代號、處理例外、考慮槽載式/虛擬光碟機差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved