如何弹出CD-ROM

时间:2011-04-04 11:09:29

标签: c# cd-rom

  

可能重复:
  Windows CDROM Eject
  Open CD/DVD door with a Windows API call?

我环顾四周,无法找到我想做的简单解决方案。

我想从我的C#应用​​程序中打开一张CD-Rom。它应该检查媒体是否实际上是一个光盘,然后打开它。有没有快速的解决方案,或者我错过了什么?

1 个答案:

答案 0 :(得分:5)

检查此网址,它包含.net

的托管代码和非托管代码

http://bytes.com/topic/c-sharp/answers/273513-how-eject-cd-rom-c

尝试以下代码:

using System;
using System.Text;
using System.Runtime.InteropServices;
namespace EjectMedia
{
class Program
{
   static void Main(string[] args)
   {
     // My CDROM is on drive E:
         EjectMedia.Eject(@"\\.\E:");
    }
}

class EjectMedia
{
         // Constants used in DLL methods
         const uint GENERICREAD = 0x80000000;
         const uint OPENEXISTING = 3;
         const uint IOCTL_STORAGE_EJECT_MEDIA = 2967560;
         const int INVALID_HANDLE = -1;

         // File Handle
         private static IntPtr fileHandle;
         private static uint returnedBytes;
         // Use Kernel32 via interop to access required methods
         // Get a File Handle
         [DllImport("kernel32", SetLastError = true)]
         static extern IntPtr CreateFile(string fileName,
         uint desiredAccess,
         uint shareMode,
         IntPtr attributes,
         uint creationDisposition,
         uint flagsAndAttributes,
         IntPtr templateFile);
         [DllImport("kernel32", SetLastError=true)]
         static extern int CloseHandle(IntPtr driveHandle);
         [DllImport("kernel32", SetLastError = true)]
         static extern bool DeviceIoControl(IntPtr driveHandle,
         uint IoControlCode,
         IntPtr lpInBuffer,
         uint inBufferSize,
         IntPtr lpOutBuffer,
         uint outBufferSize,
         ref uint lpBytesReturned,
                  IntPtr lpOverlapped);

public static void Eject(string driveLetter)
{
         try
         {         
           // Create an handle to the drive
          fileHandle = CreateFile(driveLetter,
           GENERICREAD,
           0,
           IntPtr.Zero,
           OPENEXISTING,
           0,
            IntPtr.Zero);
         if ((int)fileHandle != INVALID_HANDLE)
         {
          // Eject the disk
          DeviceIoControl(fileHandle,
           IOCTL_STORAGE_EJECT_MEDIA,
           IntPtr.Zero, 0,
           IntPtr.Zero, 0,
           ref returnedBytes,
                  IntPtr.Zero);
          }
         }
         catch
         {
                  throw new Exception(Marshal.GetLastWin32Error().ToString());
         }
         finally
         {
                  // Close Drive Handle
                  CloseHandle(fileHandle);
                  fileHandle = IntPtr.Zero;
         }
  }
 }
}