Usb Stick erkennen

Antworten
FF_Programmierer
Beiträge: 19
Registriert: Di 30. Apr 2019, 14:43
OS, Lazarus, FPC: Windows 10, Lazarus 2.0.2, FPC 3.0.4
CPU-Target: 64Bit
Wohnort: Nordhessen

Usb Stick erkennen

Beitrag von FF_Programmierer »

Hallo,
ich möchte ein Programm schreiben, was Usb-Sticks erkennt, und auf ihnen gespeicherte Autorun.inf-Dateien ausführt. Dafür muss ich erkennen wann ein Usb-Stick eingesteckt wird, und wie der Laufwerksbuchstabe lautet. Ich habe hier eine (nicht funktionierende) Unit gefunden, die schonmal prüfen soll, ob ein Usb-Stick eingesteckt wurde.

Weiß jemand, wie man das machen kann?

Viele Dank im Voraus,
Finn
Windows 10, 64bit, Lazarus 2.0.2, Fpc 3.0.4

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Usb Stick erkennen

Beitrag von Winni »

Hallo!

Erkennen wenn eine USB Gerät reingestopft wird gibt es schon mal im Internationalen Forum hier:[url]

https://forum.lazarus.freepascal.org/in ... ic=44539.0[/url]

In Reply #4 gibt user rvk einen kurzen Demo-Code für Windows.

Winni

FF_Programmierer
Beiträge: 19
Registriert: Di 30. Apr 2019, 14:43
OS, Lazarus, FPC: Windows 10, Lazarus 2.0.2, FPC 3.0.4
CPU-Target: 64Bit
Wohnort: Nordhessen

Re: Usb Stick erkennen

Beitrag von FF_Programmierer »

Vielen Dank, das funktioniert. Mein Code sieht jetzt so aus:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
uses windows;
{$R *.lfm}
 
var PrevWndProc: WNDPROC;
 
{ TForm1 }
 
function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam): LRESULT; stdcall;
begin
  if uMsg = WM_DEVICECHANGE then
  begin
    if(wParam = $8000)then Form1.Caption := 'Eingesteckt um: ' + TimeToStr(Time);
    if(wParam = $8004)then Form1.Caption := 'Rausgezogen um: ' + TimeToStr(Time);
  end;
  Result := CallWindowProc(PrevWndProc, Ahwnd, uMsg, WParam, LParam);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  PrevWndProc := Windows.WNDPROC(SetWindowLongPtr(Self.Handle, GWL_WNDPROC, PtrInt(@WndCallback)));
end;
 
end.


Allerdings habe ich noch nicht verstanden wie ich den Laufwerksbuchstaben rauskriege. Kann da nochmal jemand helfen?

Vielen Dank im Voraus,
Finn
Windows 10, 64bit, Lazarus 2.0.2, Fpc 3.0.4

df.id
Beiträge: 20
Registriert: Fr 23. Mai 2008, 00:29
OS, Lazarus, FPC: Windows|Linux (L 2.0.6 FPC 3.0.4)
CPU-Target: Intel
Wohnort: Münster
Kontaktdaten:

Re: Usb Stick erkennen

Beitrag von df.id »

Allerdings habe ich noch nicht verstanden wie ich den Laufwerksbuchstaben rauskriege. Kann da nochmal jemand helfen?
Den Laufwerksbuchstaben des zuletzt hinzugefügten USB-Sticks könnte man mit WMI/WQL ermitteln (Plattform: Windows):

Hier ist eine UNIT mit GetUsbDriveLetter:

Code: Alles auswählen

unit UsbDriveLetter;

interface

uses
 windows;

// Laufwerksbuchstabe vom letzten Wechseldatenträger
function GetUsbDriveLetter:String;

implementation

uses
 ActiveX,
 ComObj,
 Variants;

function GetUsbDriveLetter:String;
const
 WbemUser ='';
 WbemPassword ='';
 WbemComputer ='localhost';
 wbemFlagForwardOnly = $00000020;
var
 FSWbemLocator: OLEVariant;
 FWMIService: OLEVariant;
 FWbemObjectSet: OLEVariant;
 FWbemObject: {$IF FPC_FULLVERSION>=30000}OleVariant{$ELSE}Variant{$ENDIF};
 oEnum: IEnumvariant;
 CeltFetched: ULONG;
begin
 Result:='';
 FSWbemLocator:=CreateOleObject('WbemScripting.SWbemLocator');
 FWMIService:=FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
 FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_LogicalDisk WHERE Access=0 AND DriveType=2','WQL',wbemFlagForwardOnly);
 oEnum:=IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
 while oEnum.Next(1, FWbemObject{$IF FPC_FULLVERSION>=30000}, CeltFetched{$ENDIF}) = 0 do begin
  Result:=FWbemObject.Properties_.Item('DeviceID').Value;
  FWbemObject:=Unassigned;
 end;
end;

end.
VG
Dirk

Antworten