Einzelnen Beitrag anzeigen

Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
947 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: USB - Autostart dynamisch unterbinden

  Alt 24. Sep 2009, 18:24
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ß
  Mit Zitat antworten Zitat