Newsgroup: it.comp.lang.c++
Titolo: Aiuto! Messaggi e DEVICECHANGE

Salve!
sto scrivendo un programma in borland c++ che dovrebbe accorgersi di
quando viene inserito un CD o cmq cambiato supporto nel lettore.
Per far questo ho letto una tonnellata di documentazione ma alla fine
č chiaro che mi manca qualche punto di teoria.
Ho provato a 
usare laApplication->OnMessage() ma sembra che non si accorga del
cambiamento di supporto
cercare su MSDN dove ho trovato il codice che posto piů sotto, che
perň non so come utilizzare (cioč quello č un handler per il
messaggio, ma come lo rendo attivo?)
utilizzare un ciclo di GetMessage()
ma sempre senza risultato.
QUalche consiglio?
Questo č il codice dell'OnMessage che uso ora:
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
  switch (Msg.message)
  {
    case WM_CHAR:
         Process_WM_CHAR(Msg.wParam);
         Handled = true;
         break;
    case WM_DEVICECHANGE:
         Memo1->Lines->Add("WM_DEVICECHANGE");
         break;
    case WM_MOUSEMOVE:
         Memo1->Lines->Add("WM_MOUSEMOVE");
         break;
    case WM_PAINT:
         Memo1->Lines->Add("WM_PAINT");
         break;
    case WM_NCMOUSEMOVE:
         Memo1->Lines->Add("WM_NCMOUSEMOVE");
         break;
    default:
         Memo1->Lines->Add(Msg.message);
  }
}
Questo č il codice che riportano su MSDN 
(
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/detecting_media_insertion_or_removal.asp
)
/*------------------------------------------------------------------
  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:
        // 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)
          {
            wsprintf (szMsg, "Drive %c: Media has arrived.\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask));
            MessageBox (hwnd, szMsg, "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)
          {
             wsprintf (szMsg, "Drive %c: Media was removed.\n",
                       FirstDriveFromMask(lpdbv ->dbcv_unitmask));
             MessageBox (hwnd, szMsg, "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 3 = C,
     etc. 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');
}

Ciao,
Questo newsgroup si occupa del linguaggio C++ in quanto tale, e non di
aspetti specifici di particolari implementazioni. Per questo non e' il
posto piu' adatto per porre domande specifiche come la tua.
Potresti avere piu' fortuna su uno dei seguenti gruppi:
Per Win32 (95, 98, NT): it.comp.programmare.win32
Per Dos/Win 3.x: it.comp.os.dos
Per Linux:	it.comp.os.linux.development
Per C++Builder:	i gruppi borland.public.cppbuilder.*, disponibili sul
		server 
newsgroups.borland.com
 (prevalentemente in
		inglese, ma si puo' postare anche in italiano)
Grazie,
Nicola Musatti