Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen? (https://www.delphipraxis.net/185705-erkennen-ob-usb-stick-oder-sd-card-eingesteckt-oder-herausgenommen.html)

hathor 2. Jul 2015 13:42

AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mit LAZARUS 1.4.0 getestet:

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  OldWProc: WNDPROC;

implementation

{$R *.lfm}

{ TForm1 }

const DBT_DEVICEARRIVAL = $8000;
//const DBT_DEVICEQUERYREMOVE = $8001;
//const DBT_DEVICEQUERYREMOVEFAILED = $8002;
//const DBT_DEVICEREMOVEPENDING = $8003;
const DBT_DEVICEREMOVECOMPLETE = $8004;
//const DBT_DEVICETYPESPECIFIC = $8005;
//const DBT_CONFIGCHANGED = $0018;

procedure MM(s:string); begin Form1.Memo1.lines.add(s); end;

procedure FindDrives;
var
  Drive: Char;
  DriveLetter: string;
begin
  MM('The following drives were found in this computer:');
  MM('');
  // Search all drive letters
  for Drive := 'A' to 'Z' do
  begin
    DriveLetter := Drive + ':\';
    case GetDriveType(PChar(DriveLetter)) of
     DRIVE_REMOVABLE: MM(DriveLetter + ' USB Stick/Drive');
     DRIVE_FIXED:    MM(DriveLetter + ' Fixed Drive');
     DRIVE_REMOTE:   MM(DriveLetter + ' Network Drive');
     DRIVE_CDROM:    MM(DriveLetter + ' CD/DVD/BR Drive');
     DRIVE_RAMDISK:  MM(DriveLetter + ' RAM Disk');
    end;
  end;
  MM('------------------------------------------------');
end;

function MyWndProc(hWnd: HWND; uiMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  case uiMsg of
    WM_DEVICECHANGE:
  case wParam of
  DBT_DEVICEARRIVAL:
      begin
        Windows.Beep(1000,250); Windows.Beep(1500,250);
          Form1.Memo1.clear;
          MM('DEVICECHANGE: Drive added.');
        FindDrives;
        Exit;
      end;
  DBT_DEVICEREMOVECOMPLETE:
      begin
        Windows.Beep(2000,250); Windows.Beep(1500,250);
          Form1.Memo1.clear;
          MM('DEVICECHANGE: Drive removed.');
        FindDrives;
        Exit;
      end;
  end;
  end;
  Result := CallWindowProc(OldWProc, hWnd, uiMsg, wParam, lParam);
end;

procedure SetMyWndProc(Handle : THandle);
begin
     OldWProc := WNDPROC(SetWindowLongPtr(Handle, GWL_WNDPROC, LONG_PTR(@MyWndProc)));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     SetMyWndProc(Handle);
     FindDrives;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.clear;
  FindDrives;
end;

end.

BadenPower 2. Jul 2015 14:41

AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
 
Zitat:

Zitat von hathor (Beitrag 1307480)
Mit LAZARUS 1.4.0 getestet:

Funktioniert mit einem USB-Stick, aber nicht mit einer Speicherkarte.

hathor 2. Jul 2015 16:48

AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
 
Bei meinem Notebook wird die SD-Card (POPPSTAR 32GB) erkannt.

BadenPower 2. Jul 2015 17:50

AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
 
Zitat:

Zitat von hathor (Beitrag 1307509)
Bei meinem Notebook wird die SD-Card (POPPSTAR 32GB) erkannt.

Am Rechnersystem, an dem ich Deinen Code getestet hatte, hängt an einem USB-Anschluß ein CardReader, welchem immer 4 Laufwerke zugeordnet sind.

Es wird also kein Laufwerk erzeugt, wenn eine Karte eingesteckt wird und kein Laufwerk entfernt, wenn die Karte herausgenommen wird.

Popov 2. Jul 2015 21:23

AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
 
Ich weiß nicht unter was der fest eingebauter CardReader läuft, aber ein Wechsellaufwerk sollte es nicht sein. Somit sollte auch keine Meldung kommen, denn das Laufwerk ist schon da und bleibt, lediglich ein Speichermedium wird gemountet. Wenn du also ein DS Karte einsteckst, dann ist es genau so wie wenn du eine CD in das CD Laufwerk einlegst.

Neben den bei hathors Code aufgelisteten Laufwerke gibt es noch paar andere:


Delphi-Quellcode:
function DriveType(DriveByte: Byte): String;
begin
  case GetDriveType(PChar(Chr(DriveByte + Ord('A')) + ':\')) of
    DRIVE_UNKNOWN:     Result := 'unbekannt';
    DRIVE_NO_ROOT_DIR: Result := 'Laufwerk existiert nicht';
    DRIVE_REMOVABLE:   Result := 'Wechselmedium';
    DRIVE_FIXED:       Result := 'Festplatte';
    DRIVE_REMOTE:      Result := 'Netzwerk';
    DRIVE_CDROM:       Result := 'CD-ROM/DVD';
    DRIVE_RAMDISK:     Result := 'RAM Disk';
  else
    Result := 'anderer Laufwerkstyp';
  end;
end;

AlexII 3. Jul 2015 18:03

AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
 
Bei mir läuft der Code von hathor irgendwie instabil. Mal läuft alles, die Laufwerke werden erkannt und angezeigt, mal nicht...

Nachtrag: hab's rausgefunden wieso. In FormCreate muss noch SetMyWndProc(Handle); rein.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  SetMyWndProc(Handle); // <-------
  FindDrives;
end;

Schade nur, dass das die SD-Karten nicht erkennt, dass in einen bereits angeschlossenen Card-Reader eingesteckt werden. Wie bereits im #14 erwähnt.

Popov 3. Jul 2015 22:06

AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
 
Das ist jetzt nur so ins Freie geschossen, aber bei einer SD Karte würde ich nicht prüfen ob ein Laufwerk gewechselt wurde, sondern eher ob ein neuer Datenträger gemountet wurde.

mm1256 4. Jul 2015 11:00

AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
 
Um in meiner App mit zu bekommen, ob ein Datenträger eingelegt wurde, verwende ich das da

AlexII 4. Jul 2015 11:17

AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
 
Zitat:

Zitat von Popov (Beitrag 1307597)
Das ist jetzt nur so ins Freie geschossen, aber bei einer SD Karte würde ich nicht prüfen ob ein Laufwerk gewechselt wurde, sondern eher ob ein neuer Datenträger gemountet wurde.

Das stimmt, nur muss eine Message an die App darüber gesendet werden.

AlexII 4. Jul 2015 11:20

AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
 
Zitat:

Zitat von mm1256 (Beitrag 1307628)
Um in meiner App mit zu bekommen, ob ein Datenträger eingelegt wurde, verwende ich das da

Was meinst Du mit "eingelegt"? Ob ein Laufwerk X: oder so auftaucht oder ob ein Datenträger gemountet wurde?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:10 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz