Bagikan melalui


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' );
}

Peristiwa Perangkat