Hallo
Zitat:
Scan findet leider nur das Laufwerk. In der Spalte Class steht "not found" und der Rest bleibt stest leer.
Ist auch kein Wunder, Scan ermittelt nur die Daten von
USBSTOR-Laufwerken und zeigt
die VID/PID-Kombi und falls vorhanden die ID an. Benutze es mal mit einem USB-Cardreader/Stick.
Das mit dem Laufwerk ist relative Simpel, wenn man sich auf Wechseldatenträger beschränkt:
Delphi-Quellcode:
procedure ShowRemovableDrives;
var
I : Integer;
D : String;
L : TListItem;
begin
lvRemovable.Items.Clear;
for I := Ord('D') to Ord('Z') do
begin
D := Char(I);
if GetDriveType(pChar(D + ':\')) = DRIVE_REMOVABLE then
begin
L := lvRemovable.Items.Add;
L.Caption := D + ':\';
end;
end;
end;
Wobei
lvRemovable ein ListView ist.
Einzelheiten zum ermitteln der VID/PID und anderes findest du in der
DP, Jahrgang 2004.
Also einfach die
Suche anschmeißen und durchkämpfen.
Und zum Überprüfen ob auch ein Datenträger vorhanden ist, kann dies genommen werden:
Delphi-Quellcode:
FUNCTION DiskInDrive(Drive: CHAR): BOOLEAN;
{ Funktion, um zu prüfen, ob ein Datenträger eingelegt ist.
Drive : Laufwerk (A..Z oder a..z)
Ergebnis: TRUE, wenn Datenträger eingelegt ist
FALSE, wenn kein Datenträger eingelegt ist
oder ein ungültiges Laufwerk angegeben wurde }
VAR
ErrorMode: WORD;
BEGIN
Result := FALSE;
Drive := Char(Byte(Drive)
AND $
DF);
// groß
IF (Drive < '
A')
OR (Drive > '
Z')
THEN Exit;
ErrorMode := SetErrorMode(SEM_FailCriticalErrors);
TRY
IF DiskSize(Ord(Drive) - $40) = -1
THEN
Result := FALSE
ELSE
Result := TRUE;
FINALLY
SetErrorMode(ErrorMode);
END;
END;
Zitat:
...
Da es unterschiedliche Messages sind, brauch ich wohl auch 2 Proceduren
...
Nicht unbedingt, packes es in eine einfache Componente und nutze
WndProc.
Auch dazu gibt es genug Beispiele in der
DP, zB:
Delphi-Quellcode:
procedure TWeisNichtWie.WndProc(
var Msg : TMessage)
begin
case Msg.Msg
of
WM_DEVICECHANGE :
begin
WMDeviceChange(TWMDeviceChange(Msg));
Result := Msg.Result;
end;
WM_AUTOPLAY : Msg.Result := 1;
else
Msg.Result := DefWindowProc(
Handle, Msg.Msg, Msg.wParam, Msg.lParam);
end;
end;
Und schau dir dazu nochmals die USBStor.pas an(wegen des
Handle usw.).
So und falls noch Fragen sind, immer Fragen.
Gruß