65.9K
CodeProject 正在变化。 阅读更多。
Home

打开或关闭光驱托盘

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (15投票s)

2007年3月27日

1分钟阅读

viewsIcon

85595

downloadIcon

1364

提供一个示例项目,其中包含打开和/或关闭光驱托盘的代码。

Screenshot - CDOpen1.jpg

引言

这个项目演示了如何打开和关闭光驱或 DVD 驱动器托盘。它也适用于我最近购买的新蓝光驱动器。

背景

我需要一种方法来打开和/或关闭驱动器托盘,而无需考虑托盘是否已经打开或关闭。听起来很简单,但我尝试过的大多数方法(例如使用 MCI 库)都存在问题,无法确定托盘是否打开或关闭。使用这段代码,我只需告诉它我想要它做什么。如果它已经打开,它将保持打开状态;如果它已关闭,它将保持关闭状态。

使用代码

这段代码没有什么花哨的地方。用户可以简单地从这个示例中剪切和粘贴所需的代码到他们自己的项目中。它使用了一个相当简单的 IOCTL 调用。注意:该函数返回调用是否成功,但这不一定是调用者想要的结果。例如,大多数笔记本电脑会报告驱动器已关闭,但驱动器必须手动关闭。程序员可以通过检测驱动器中没有准备好的光盘来解决这个问题。

// Opens or closes the CD or DVD drive specified in drive letter.
bool COpenCloseCDDlg::OpenCloseTray(bool bOpen, TCHAR cDrive)
{
    // Open the device (drive) that we want to affect
    CString cs;
    cs.Format(_T("\\\\.\\%c:"),cDrive);
    HANDLE hDrive = CreateFile(cs, GENERIC_READ, FILE_SHARE_READ, 
                               NULL, OPEN_EXISTING, 
    FILE_ATTRIBUTE_NORMAL, NULL);

    // Make sure the device was found and opened successfully
    if(hDrive == INVALID_HANDLE_VALUE || GetLastError() != NO_ERROR)
        return false;

    BOOL bStatus; // Let the caller know if it worked or not
    DWORD dwDummy; // We don't really need this info
    if(bOpen) // Open the tray
        bStatus = DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, NULL, 
                                  0, NULL, 0, &dwDummy, NULL);
    else // Close the tray
        bStatus = DeviceIoControl(hDrive, IOCTL_STORAGE_LOAD_MEDIA, 
                                  NULL, 0, NULL, 0, &dwDummy, NULL);
    CloseHandle(hDrive);
    return bStatus?true:false;
}

历史

  • 版本 1.0 - 2007 年 3 月 28 日
© . All rights reserved.