Programatically ejecting and retracting the CD drive in vb.net or c#

后端 未结 2 1458
隐瞒了意图╮
隐瞒了意图╮ 2020-12-09 14:05

Is there any way to do so? I know its possible to programmatically eject/retract the cd drive SOMEHOW, cause Roxio does that when it prompts me to insert a disk.

Eit

相关标签:
2条回答
  • 2020-12-09 14:21

    Here's an alternative solution to the accepted one, converted from a VB.NET sample:

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    
    class Test
    {
        const int OPEN_EXISTING = 3;
        const uint GENERIC_READ = 0x80000000;
        const uint GENERIC_WRITE = 0x40000000;
        const uint IOCTL_STORAGE_EJECT_MEDIA = 2967560;
    
        [DllImport("kernel32")]
        private static extern IntPtr CreateFile
            (string filename, uint desiredAccess, 
             uint shareMode, IntPtr securityAttributes,
             int creationDisposition, int flagsAndAttributes, 
             IntPtr templateFile);
    
        [DllImport("kernel32")]
        private static extern int DeviceIoControl
            (IntPtr deviceHandle, uint ioControlCode, 
             IntPtr inBuffer, int inBufferSize,
             IntPtr outBuffer, int outBufferSize, 
             ref int bytesReturned, IntPtr overlapped);
    
        [DllImport("kernel32")]
        private static extern int CloseHandle(IntPtr handle);
    
        static void EjectMedia(char driveLetter)
        {
            string path = "\\\\.\\" + driveLetter + ":";
            IntPtr handle = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, 
                                       IntPtr.Zero, OPEN_EXISTING, 0,
                                       IntPtr.Zero);
            if ((long) handle == -1)
            {
                throw new IOException("Unable to open drive " + driveLetter);
            }
            int dummy = 0;
            DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, 
                            IntPtr.Zero, 0, ref dummy, IntPtr.Zero);
            CloseHandle(handle);
        }
    
        static void Main()
        {
            EjectMedia('f');
        }
    }
    
    0 讨论(0)
  • 2020-12-09 14:37
    using System.Runtime.InteropServices;
    
    [DllImport("winmm.dll")]
    static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);
    
    // To open the door
    mciSendString("set CDAudio door open", null, 0, IntPtr.Zero);
    
    // To close the door
    mciSendString("set CDAudio door closed", null, 0, IntPtr.Zero);
    

    http://www.geekpedia.com/tutorial174_Opening-and-closing-the-CD-tray-in-.NET.html

    0 讨论(0)
提交回复
热议问题