メディア挿入または削除の検出
Windows は、新しいデバイスまたはメディア (CD や DVD など) が追加されて使用可能になったとき、および既存のデバイスまたはメディアが削除されたときに、すべての最上位ウィンドウに既定の WM_DEVICECHANGE メッセージ セットを送信します。 これらの既定のメッセージの受信を登録する必要はありません。 既定で送信されるメッセージについて詳しくは、RegisterDeviceNotification の「解説」セクションをご覧ください。 以下のコード例のメッセージは、既定のメッセージの 1 つです。
Note
Windows は、CD または DVD メディア イベントの WM_DEVICECHANGE メッセージのみを、アクティブなコンソール セッションで実行されるアプリケーションによって所有される最上位のウィンドウに送信します。 リモート デスクトップ セッションで実行されるアプリケーションによって所有される最上位のウィンドウは、CD または DVD メディア イベントの WM_DEVICECHANGE メッセージを受信しません。
各 WM_DEVICECHANGE メッセージには、変更を説明するイベントと、変更に関する詳細情報を提供する構造が関連付けられています。 構造は、イベントに依存しないヘッダー、DEV_BROADCAST_HDR の後、イベントに依存するメンバーで構成されます。 イベントに依存するメンバーは、イベントが適用されるデバイスを記述します。 この構造を使用するには、まずアプリケーションがイベントの種類とデバイスの種類を決定する必要があります。 その後、適切な構造を使用して適切なアクションを実行できます。
ユーザーが新しい CD または DVD をドライブに挿入すると、アプリケーションは DBT_DEVICEARRIVAL イベントと共に WM_DEVICECHANGE メッセージを受け取ります。 アプリケーションは、到着するデバイスの種類がボリューム (dbch_devicetype メンバーが DBT_DEVTYP_VOLUME) であり、変更がメディアに影響を与える (dbcv_flags メンバーが DBTF_MEDIA) ことを確認するために、イベントを確認する必要があります。
ユーザーがドライブから CD または DVD を削除すると、アプリケーションは DBT_DEVICEREMOVECOMPLETE イベントと共に WM_DEVICECHANGE メッセージを受け取ります。 ここでも、アプリケーションはイベントを確認し、削除されるデバイスがボリュームであり、変更がメディアに影響を与えることを確認する必要があります。
次のコードは、CD や 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' );
}
関連トピック