Im Zusammenhang mit Horsts CD-Titellisten aber vielleicht auch sonst manchmal brauchbar. Wie kann ich das Hinzufügen oder Entfernen von Laufwerken erkennen.
$H Messages.PH
$H Windows.PH
Proc DriveChange
Declare Int DriveMask, Typ, Flags, String Drives, Datei, ID
If &UWParam = $8000 ' DBT_DEVICEARRIVAL
Typ = Long(&ULParam, 4)
DriveMask = Long(&ULParam, 12)
Flags = Long(&ULParam, 16)
If Typ = 2
If DriveMask
WhileLoop 0, 31
Case TestBit(DriveMask, &Loop) : Drives = Drives + Chr$(&Loop + 65)
EndWhile
EndIf
MessageBox(Drives + "\nTyp = " + Str$(Typ) + "\nFlags = " + Str$(Flags), "Laufwerke hinzugefügt", 0)
EndIf
ElseIf &UWParam = $8004 'DBT_DEVICEREMOVECOMPLETE
Typ = Long(&ULParam, 4)
DriveMask = Long(&ULParam, 12)
Flags = Long(&ULParam, 16)
If Typ = 2
If DriveMask
WhileLoop 0, 31
Case TestBit(DriveMask, &Loop) : Drives = Drives + Chr$(&Loop + 65)
EndWhile
EndIf
MessageBox(Drives + "\nTyp = " + Str$(Typ) + "\nFlags = " + Str$(Flags), "Laufwerke entfernt", 0)
EndIf
EndIf
EndProc
Proc EjectMedia
Parameters String ExDrive
Declare Handle hFile
Declare String EjectName
Declare Pointer dummy
Case ExDrive = "" : Return
Case Len(ExDrive) = 1 : ExDrive = ExDrive + ":"
EjectName = "\\\\.\\" + Left$(ExDrive, 2)
hFile = ~CreateFile(EjectName, ~GENERIC_READ | ~GENERIC_WRITE, 0, 0, ~OPEN_EXISTING, 0, 0)
If hFile = -1
MessageBox("Gerätezugriff nicht möglich!", "Auswurffehler", 0)
Else
~DeviceIoControl(hFile, $2D4808, 0, 0, 0, 0, Addr(dummy), 0) ' ~IOCTL_STORAGE_EJECT_MEDIA
~CloseHandle(hFile)
' Als Quittung für erfolgten Auswurf bekommt DriveChange das Kommando "Laufwerk entfernt"
' Bei Stick oder Speicherkarte diese erst nach Erhalt dieses Kommandos entnehmen!
EndIf
EndProc
UserMessages ~wm_DeviceChange
CLS
While 1
WaitInput
Case %UMessage = ~wm_DeviceChange : DriveChange
EndWhile
Alles anzeigen
Das Ergebnis wird hier jeweils als Messagebox angezeigt. Ist also den eigenen Gegebenheiten entsprechend anzupassen. Beim Laufwerksbuchstaben kann eine Liste von mehreren Laufwerken enthalten sein, wenn ein Kombigerät hinzugefügt/entfernt wird, daß mehrere Laufwerksbuchstaben verwendet.
Als kleine Ergänzung noch den Auswurf. Die Prozedur EjectMedia mit dem gewünschten Laufwerk als Parameter aufrufen. Der Parameter kann nur der Laufwerksbuchstabe oder der vollständige Name einer beliebigen Datei auf dem auszuwerfenden Medium sein.
Bei einem optischen Laufwerk wird jetzt die Lade geöffnet, Sticks und Speicherkarten werden sauber ohne Gefahr von Datenverlust getrennt. Das Programm erhält als Quittung in jedem Falle DriveChange. USB-Geräte können daraufhin entfernt werden.
Gruß Volkmar
Noch ein kleiner Nachsatz: In DriveChange gibt es die Variable Flags, die hat bei CDs den Wert 1 und bei USB-Geräten den Wert 0.