Detectando inserção ou remoção de mídia
O Windows envia a todas as janelas de nível superior um conjunto de mensagens de WM_DEVICECHANGE padrão quando novos dispositivos ou mídia (como um CD ou DVD) são adicionados e ficam disponíveis, e quando dispositivos ou mídia existentes são removidos. Você não precisa se registrar para receber essas mensagens padrão. Consulte a seção Comentários em RegisterDeviceNotification para obter detalhes sobre quais mensagens são enviadas por padrão. As mensagens no exemplo de código abaixo estão entre as mensagens padrão.
Observação
O Windows só envia mensagens de WM_DEVICECHANGE para eventos de mídia de CD ou DVD para janelas de nível superior que pertencem a aplicativos executados na sessão de console ativa. As janelas de nível superior que pertencem a aplicativos executados em uma sessão de área de trabalho remota não recebem mensagens de WM_DEVICECHANGE para eventos de mídia de CD ou DVD.
Cada mensagem WM_DEVICECHANGE tem um evento associado que descreve a alteração e uma estrutura que fornece informações detalhadas sobre a alteração. A estrutura consiste em um cabeçalho independente de evento, DEV_BROADCAST_HDR, seguido por membros dependentes de evento. Os membros dependentes do evento descrevem o dispositivo ao qual o evento se aplica. Para usar essa estrutura, os aplicativos devem primeiro determinar o tipo de evento e o tipo de dispositivo. Então, eles podem usar a estrutura correta para tomar as medidas apropriadas.
Quando o usuário insere um novo CD ou DVD em uma unidade, os aplicativos recebem uma mensagem de WM_DEVICECHANGE com um evento DBT_DEVICEARRIVAL. O aplicativo deve verificar o evento para garantir que o tipo de dispositivo que chega é um volume (o membro dbch_devicetype é DBT_DEVTYP_VOLUME) e que a alteração afeta a mídia (o membro dbcv_flags é DBTF_MEDIA).
Quando o usuário remove um CD ou DVD de uma unidade, os aplicativos recebem uma mensagem de WM_DEVICECHANGE com um evento DBT_DEVICEREMOVECOMPLETE . Novamente, o aplicativo deve verificar o evento para garantir que o dispositivo que está sendo removido seja um volume e que a alteração afete a mídia.
O código a seguir demonstra como verificar a inserção ou remoção de um CD ou DVD.
#include <windows.h>
#include <dbt.h>
#include <strsafe.h>
#pragma comment(lib, "user32.lib" )
void Main_OnDeviceChange( HWND hwnd, WPARAM wParam, LPARAM lParam );
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;
TCHAR szMsg[80];
switch(wParam )
{
case DBT_DEVICEARRIVAL:
// Check whether a CD 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)
{
StringCchPrintf( szMsg, sizeof(szMsg)/sizeof(szMsg[0]),
TEXT("Drive %c: Media has arrived.\n"),
FirstDriveFromMask(lpdbv ->dbcv_unitmask) );
MessageBox( hwnd, szMsg, TEXT("WM_DEVICECHANGE"), MB_OK );
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
// Check whether a CD or DVD 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)
{
StringCchPrintf( szMsg, sizeof(szMsg)/sizeof(szMsg[0]),
TEXT("Drive %c: Media was removed.\n" ),
FirstDriveFromMask(lpdbv ->dbcv_unitmask) );
MessageBox( hwnd, szMsg, TEXT("WM_DEVICECHANGE" ), MB_OK );
}
}
break;
default:
/*
Process other WM_DEVICECHANGE notifications for other
devices or reasons.
*/
;
}
}
/*------------------------------------------------------------------
FirstDriveFromMask( unitmask )
Description
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 2 = C,
and so on. A valid drive letter is defined when the
corresponding bit is set to 1.
Returns the first drive letter that was found.
--------------------------------------------------------------------*/
char FirstDriveFromMask( ULONG unitmask )
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return( i + 'A' );
}
Tópicos relacionados