Получение уведомлений о вставке или удалении компакт-диска
Некоторые приложения должны знать, когда пользователь вставляет или удаляет компакт-диск или DVD-диск с компакт-диска, не опрашивая об изменениях мультимедиа. Windows предоставляет способ уведомления этих приложений WM_DEVICECHANGE
с помощью сообщения. В этой статье объясняется, как обработать WM_DEVICECHANGE
сообщение для обнаружения изменений компакт-дисков или DVD-носителей.
Исходная версия продукта: Windows
Исходный номер базы знаний: 163503
Уведомление Windows
Windows отправляет всем окнам WM_DEVICECHANGE
верхнего уровня сообщение при добавлении и доступности новых устройств или носителей, а также при удалении существующих устройств или носителей. С каждым WM_DEVICECHANGE
сообщением связано событие, описывающее изменение, и структура, которая предоставляет подробные сведения об изменении.
Структура состоит из независимого от события заголовка, за которым следует структура, зависящая от событий. Зависимая от событий часть структуры описывает, к какому устройству применяется событие. Чтобы использовать эту структуру, приложения должны сначала определить тип события и тип устройства. Затем они могут использовать правильную структуру для выполнения соответствующих действий.
Когда пользователь вставляет в дисковод новый компакт-диск или DVD-диск, приложения получают WM_DEVICECHANCE
сообщение с событием DBT_DEVICEARRIVAL
. Приложение должно проверка событие, чтобы убедиться, что тип устройства, поступающего, является томом (DBT_DEVTYP_VOLUME
), а флаг носителя события (DBTF_MEDIA
) установлен.
Когда пользователь удаляет компакт-диск с компакт-диска или DVD-диска, приложения получат WM_DEVICECHANCE
сообщение с событием DBT_DEVICEREMOVECOMPLETE
. Как и в случае вышеDBT_DEVICEARRIVAL
, приложение должно проверка событие, чтобы убедиться, что удаляемое устройство является томом и что для события установлен флаг мультимедиа.
Пример кода
В следующем коде показано, как использовать WM_DEVICECHANGE
сообщение для проверка для вставки или удаления компакт-дисков или DVD-дисков.
#include <windows.h>
#include <dbt.h>
char FirstDriveFromMask (ULONG unitmask); //prototype
/*----------------------------------------------------------------------
Main_OnDeviceChange (hwnd, wParam, lParam)
Description
Handles WM_DEVICECHANGE messages sent to the application's top-level window.
----------------------------------------------------------------------*/
void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
char szMsg[80];
switch(wParam)
{
case DBT_DEVICEARRIVAL:
// See if a CD-ROM or DVD was inserted into a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
wsprintf (szMsg, "Drive %c: arrived\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask));
MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
// See if a CD-ROM was removed from a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
wsprintf (szMsg, "Drive %c: was removed\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask));
MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
}
}
break;
default:
/*
Other WM_DEVICECHANGE notifications get sent for other devices or
reasons; we don't care about them here. If they were important, we
would check for them and act accordingly.
*/
;
}
}
/*----------------------------------------------------------------------
FirstDriveFromMask (unitmask)
Finds the first valid drive letter from a mask of drive letters.
The mask must be in the format bit 0 = A, bit 1 = B, bit 3 = C, etc.
A valid drive letter is defined when the corresponding bit is set to 1.
Returns the drive letter that was first found.
----------------------------------------------------------------------*/
char FirstDriveFromMask (ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
Хотя этот пример кода проверяет только поступление томов из-за вставки нового носителя, его можно расширить, чтобы получать уведомления о других событиях оборудования для других типов. Для этого необходимо добавить варианты для других событий устройства и обрабатывать различные типы устройств для каждого события.