Mendeteksi Penyisipan atau Penghapusan Media
Windows mengirim semua jendela tingkat atas sekumpulan pesan WM_DEVICECHANGE default ketika perangkat atau media baru (seperti CD atau DVD) ditambahkan dan tersedia, dan ketika perangkat atau media yang ada dihapus. Anda tidak perlu mendaftar untuk menerima pesan default ini. Lihat bagian Keterangan di RegisterDeviceNotification untuk detail tentang pesan mana yang dikirim secara default. Pesan dalam contoh kode di bawah ini adalah salah satu pesan default.
Catatan
Windows hanya mengirim pesan WM_DEVICECHANGE untuk peristiwa media CD atau DVD ke jendela tingkat atas yang dimiliki oleh aplikasi yang berjalan di sesi konsol aktif. Jendela tingkat atas yang dimiliki oleh aplikasi yang berjalan dalam sesi desktop jarak jauh tidak menerima pesan WM_DEVICECHANGE untuk peristiwa media CD atau DVD.
Setiap pesan WM_DEVICECHANGE memiliki peristiwa terkait yang menjelaskan perubahan, dan struktur yang menyediakan informasi terperinci tentang perubahan tersebut. Struktur terdiri dari header independen peristiwa, DEV_BROADCAST_HDR, diikuti oleh anggota yang bergantung pada peristiwa. Anggota yang bergantung pada peristiwa menjelaskan perangkat tempat peristiwa diterapkan. Untuk menggunakan struktur ini, aplikasi harus terlebih dahulu menentukan jenis peristiwa dan jenis perangkat. Kemudian, mereka dapat menggunakan struktur yang benar untuk mengambil tindakan yang sesuai.
Saat pengguna memasukkan CD atau DVD baru ke dalam drive, aplikasi menerima pesan WM_DEVICECHANGE dengan peristiwa DBT_DEVICEARRIVAL. Aplikasi harus memeriksa peristiwa untuk memastikan bahwa jenis perangkat yang tiba adalah volume (anggota dbch_devicetype DBT_DEVTYP_VOLUME) dan bahwa perubahan memengaruhi media (anggota dbcv_flags DBTF_MEDIA).
Saat pengguna menghapus CD atau DVD dari drive, aplikasi menerima pesan WM_DEVICECHANGE dengan peristiwa DBT_DEVICEREMOVECOMPLETE. Sekali lagi, aplikasi harus memeriksa peristiwa untuk memastikan bahwa perangkat yang dihapus adalah volume dan bahwa perubahan tersebut memengaruhi media.
Kode berikut menunjukkan cara memeriksa penyisipan atau penghapusan CD atau 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' );
}
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk