偵測媒體插入或移除
Windows 會在新增裝置或媒體(例如 CD 或 DVD)新增並可供使用時,以及移除現有裝置或媒體時,傳送一組預設 WM_DEVICECHANGE 訊息。 您不需要註冊即可接收這些預設訊息。 如需預設傳送訊息的詳細數據,請參閱 RegisterDeviceNotification 中的一節。 下列程式代碼範例中的訊息是預設訊息之一。
注意
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' );
}
相關主題