Программно извлекать и убирать CD-привод в vb.net или C#
Есть ли способ сделать это? Я знаю, что можно программно извлечь / убрать дисковод компакт-дисков SOMEHOW, потому что Roxio делает это, когда мне предлагают вставить диск.
Либо C#, либо vb.net предпочтительнее, но c и C++ тоже подходят как последнее средство.
Я почти уверен, что есть какой-то способ сделать это, я просто не знаю методов для вызова.
Я понимаю, что это несколько необычный запрос, так как Google ничего не дал, когда я искал методы...
2 ответа
Решение
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
Вот альтернативное решение, принятое из примера VB.NET:
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');
}
}