Benachrichtigung bei CD-Wechsel
Wenn eine CD ins Laufwerk einlegt oder eine CD herausgenommen wird, wird die Botschaft WM_DeviceChange an alle Anwendungen geschickt.Über den Parameter WParam kann bestimmt werden welche Aktion durchgeführt wurde.Die Botschaft wird nur verschickt, wenn die ‚Automatische Benachrichtigung bei Wechsel‘ aktiv ist.In dem Botschaftsrecord sind weitere Informationen zum Datenträger-Wechsel enthalten. So lässt sich über die Variable „lpdbv.dbcv_unitmask“ ermitteln, auf welches Laufwerk sich der Wechsel bezieht.
private procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE; function GetFirstDrive(UnitMask: DWORD): Char; var I: Char; begin Result:=#0; for I:='A' to 'Z' do begin if (UnitMask and 1) = 1 then begin Result:=I; break; end; UnitMask:=UnitMask shr 1; end; end; procedure TForm1.WMDeviceChange(var Msg: TMessage); var lpdb: PDevBroadcastHdr; lpdbv: PDevBroadcastVolume; begin lpdb:=PDevBroadcastHdr(Msg.lParam); case Msg.wParam of //Datenträger eingelegt DBT_DeviceArrival: //Prüfen, ob es sich um eine DVD oder CD handelt. if lpdb^.dbch_devicetype = DBT_DevTyp_Volume then begin lpdbv:=PDevBroadcastVolume(Msg.lParam); if lpdbv.dbcv_flags = DBTF_Media then Label1.Caption:=Format('Datenträger in Laufwerk %s eingelegt.', [GetFirstDrive(lpdbv.dbcv_unitmask)]); end; //Datenträger entfernt DBT_DeviceRemoveComplete: //Prüfen, ob es sich um eine DVD oder CD handelt. if lpdb^.dbch_devicetype = DBT_DevTyp_Volume then begin lpdbv:=PDevBroadcastVolume(Msg.lParam); if lpdbv.dbcv_flags = DBTF_Media then Label1.Caption:=Format('Datenträger aus Laufwerk %s entfernt.', [GetFirstDrive(lpdbv.dbcv_unitmask)]); end; end; //case end;
Die Deklarationen der entsprechenden Typen finden Sie in der DBT.h. Eine Pascal-Übersetzung der Unit sind in der JEDI JCL enthalten:
const DBT_DEVICEARRIVAL = $8000; const DBT_DEVICEREMOVECOMPLETE = $8004; const DBTF_MEDIA = $0001; const DBT_DEVTYP_VOLUME = $0002; type PDevBroadcastHdr = ^TDevBroadcastHdr; {$EXTERNALSYM DEV_BROADCAST_HDR} DEV_BROADCAST_HDR = packed record dbch_size: DWORD; dbch_devicetype: DWORD; dbch_reserved: DWORD; end; TDevBroadcastHdr = DEV_BROADCAST_HDR; PDevBroadcastVolume = ^TDevBroadcastVolume; {$EXTERNALSYM DEV_BROADCAST_VOLUME} DEV_BROADCAST_VOLUME = packed record dbcv_size: DWORD; dbcv_devicetype: DWORD; dbcv_reserved: DWORD; dbcv_unitmask: DWORD; dbcv_flags: Word; end; TDevBroadcastVolume = DEV_BROADCAST_VOLUME;
Die Dokumentation der Botschaft finden Sie in der PSDK unter dem Stichwort „WM_DEVICECHANGE“. Der oben stehende Quelltext basiert auf dem Beispiel, welches in der MSDN zu finden ist: msdn.microsoft.com/library/default.asp /devio/base/detecting_media_insertion_or_removal.asp