This tutorial will teach you how to open and close the CD / DVD tray in C# by using the winmm DLL and unmanaged code calls with PInvoke.
Microsoft .NET Framework doesn’t provide a method that you can simply call for opening or closing the CD or DVD tray of the computer drives. However, that doesn’t mean this can’t be easily accomplished by using the mciSendString from the Windows API. The project attached to this tutorial is created in Visual Studio 2005, but the code works in Visual Studio 2003 aswell.
Start by creating a C# Windows application project. And drag two buttons to the form, btnOpen and btnClose, which will open and close the CD / DVD tray when clicked.
Now switch to code view, and add the following using directive, since we’ll be working with unmanaged code:
Inside the class (normally above the constructor), use the following two lines of code. They will call the winmm.dll DLL file into our C# code, using a mechanism known as PInvoke. This DLL (winmm.dll) is located in the System32 directory of Windows. The mciSendString function is used to send a command string to an MCI device, in this case the CD / DVD drive.
[DllImport("winmm.dll")] static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);
Now back at the form, double click the Open button (btnOpen) you added, to get the Click event handler. Inside the event handler, use the following code:
mciSendString("set CDAudio door open", null, 0, IntPtr.Zero);
We are sending the set CDAudio door open command to the MCI device (the CD / DVD drive). You can run your application, click the button and wait for the tray to open.
Now you probably want to know how to close the tray too. So back at the form, double click the Close button (btnClose) and use the following function call to send the drive the set CDAudio door closed command:
mciSendString("set CDAudio door closed", null, 0, IntPtr.Zero);
After you compile and test this C# application, you will be able to open and close the drive’s disc tray, and that with only a few lines of code.
I know what many of you are thinking now: “I have multiple CD / DVD drives and only one of them opens. How can I choose which one?”.
The commands we sent above, only open / close the drive that’s marked as the default drive for playing audio CDs. To open the other drives, we need to specify the letter of the drive that we wish to open. Let’s say you have two DVD drives – H: and I: – like I do. Replace the code we wrote before in the button event handlers, with the following:
// Open Drive H: mciSendString("open H: type CDAudio alias driveH", null, 0, IntPtr.Zero); mciSendString("set driveH door open", null, 0, IntPtr.Zero); // Open Drive I: mciSendString("open I: type CDAudio alias driveI", null, 0, IntPtr.Zero); mciSendString("set driveI door open", null, 0, IntPtr.Zero);
We first create an alias name for the H: drive named driveH, as a CDAudio type of drive, then in the second command, we open it by specifing the alias instead of CDAudio. The same thing is done for the I: drive.
The command for closing both drives is now obvious:
// Close Drive H: mciSendString("open H: type CDAudio alias driveH", null, 0, IntPtr.Zero); mciSendString("set driveH door closed", null, 0, IntPtr.Zero); // Close Drive I: mciSendString("open I: type CDAudio alias driveI", null, 0, IntPtr.Zero); mciSendString("set driveI door closed", null, 0, IntPtr.Zero);
Only that to optimize this code a little bit, you can use the alias lines only once, by calling them in the form’s Load event, and then just call the open door / close door commands in the event handlers of the buttons.