CD-ROM ekleme veya kaldırma bildirimi alma

Bazı uygulamaların, medya değişikliklerini yoklamadan kullanıcının cd-ROM sürücüsüne ne zaman cd veya DVD taktığını veya kaldırdığında bunu bilmesi gerekir. Windows, bu uygulamaları ileti aracılığıyla bilgilendirmek WM_DEVICECHANGE için bir yol sağlar. Bu makalede, CD-ROM veya DVD medya değişikliklerini algılamak için iletiyi işleme WM_DEVICECHANGE açıklanmaktadır.

Orijinal ürün sürümü: Windows
Özgün KB numarası: 163503

Windows bildirimi

Windows, yeni cihazlar veya medya eklenip kullanılabilir duruma geldiğinde ve mevcut cihazlar veya medya kaldırıldığında tüm üst düzey pencerelere bir WM_DEVICECHANGE ileti gönderir. Her WM_DEVICECHANGE iletinin, değişikliği açıklamak için kendisiyle ilişkilendirilmiş bir olayı ve değişiklik hakkında ayrıntılı bilgi sağlayan bir yapısı vardır.

Yapı, olaydan bağımsız bir üst bilgiden ve ardından olaya bağımlı bir yapıdan oluşur. Yapının olaya bağımlı bölümü, olayın hangi cihaza uygulanacağı açıklanmaktadır. Bu yapıyı kullanmak için uygulamaların önce olay türünü ve cihaz türünü belirlemesi gerekir. Ardından, uygun eylemi yapmak için doğru yapıyı kullanabilirler.

Kullanıcı bir sürücüye yeni bir cd veya DVD taktığında, uygulamalar olay içeren bir WM_DEVICECHANCEDBT_DEVICEARRIVAL ileti alır. Uygulamanın gelen cihaz türünün bir birim () olduğundan ve olayın medya bayrağının (DBT_DEVTYP_VOLUMEDBTF_MEDIA) ayarlandığından emin olmak için olayı denetlemesi gerekir.

Kullanıcı CD-ROM sürücüsünden veya DVD'den cd diski kaldırdığında, uygulamalar bir olay içeren bir WM_DEVICECHANCEDBT_DEVICEREMOVECOMPLETE ileti alır. Yukarıdaki gibi DBT_DEVICEARRIVAL , uygulamanın kaldırılan cihazın bir birim olduğundan ve olayın medya bayrağının ayarlandığından emin olmak için olayı denetlemesi gerekir.

Örnek kod

Aşağıdaki kod, cd veya DVD ekleme veya kaldırmayı denetlemek için iletinin WM_DEVICECHANGE nasıl kullanılacağını gösterir.

#include <windows.h>
#include <dbt.h>

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;
   char szMsg[80];

   switch(wParam)
   {
      case DBT_DEVICEARRIVAL:
      // See if a CD-ROM 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)
         {
            wsprintf (szMsg, "Drive %c: arrived\n",
                     FirstDriveFromMask(lpdbv ->dbcv_unitmask));
            MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
         }
      }
      break;

      case DBT_DEVICEREMOVECOMPLETE:
      // See if a CD-ROM 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)
         {
            wsprintf (szMsg, "Drive %c: was removed\n",
                     FirstDriveFromMask(lpdbv ->dbcv_unitmask));
            MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
         }
      }
      break;

      default:
     /*
       Other WM_DEVICECHANGE notifications get sent for other devices or 
       reasons; we don't care about them here.  If they were important, we 
       would check for them and act accordingly.
    */
     ;
   }
}
/*----------------------------------------------------------------------
   FirstDriveFromMask (unitmask)
   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 3 = C, etc.
   A valid drive letter is defined when the corresponding bit is set to 1.
   Returns the drive letter that was first found.
   ----------------------------------------------------------------------*/
char FirstDriveFromMask (ULONG unitmask)
{
   char i;

   for (i = 0; i < 26; ++i)
   {
      if (unitmask & 0x1)
            break;
      unitmask = unitmask >> 1;
   }
   return (i + 'A');
}

Bu örnek kod yalnızca yeni medyanın eklenmesi nedeniyle toplu varışları denetlese de, diğer türlerde de diğer donanım olaylarının bildirimini almak üzere genişletilebilir. Bunu yapmak için diğer cihaz olayları için servis talepleri eklemeniz ve her olay için farklı cihaz türlerini işlemeniz gerekir.