AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Lazarus (IDE) Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?

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

Ein Thema von AlexII · begonnen am 30. Jun 2015 · letzter Beitrag vom 4. Jul 2015
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

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

  Alt 1. Jul 2015, 15:30
Also den kleinen Tipp von mir hast du nicht umgesetzt?
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//Reagiert auf Hinzufügen oder entfernen von Laufwerken
procedure TForm1.WMDeviceChange(var Msg: TMessage);
const
  DBT_DEVICEARRIVAL = $8000; // System eindeckt ein neues Grerät
  DBT_DEVICEREMOVECOMPLETE = $8004; // Gerät wurde entfernt
begin
  inherited;

  case Msg.wParam of
  DBT_DEVICEARRIVAL: //hinzu
      begin
        ShowMessage('Ein Gerät wurde hinzugefügt.');
      end;
  DBT_DEVICEREMOVECOMPLETE: //entfernen
      begin
        ShowMessage('Ein Gerät wurde entfernt.');
      end;
  end;
end;
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#2

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

  Alt 1. Jul 2015, 15:55
Also den kleinen Tipp von mir hast du nicht umgesetzt?

Bin gerade dabei... aber dieser Code hier wird wahrscheinlich mit Lazarus nicht funktionieren. LCL leitet die Message an die App bzw. das Form nicht weiter. Habe es gelesen... nachdem ich viele Beispiele hier ausprobiert habe und die nicht funktionierten.
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#3

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

  Alt 2. Jul 2015, 13:42
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 := 'Ato 'Zdo
  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.
Angehängte Dateien
Dateityp: zip FindDrives.zip (574,5 KB, 27x aufgerufen)

Geändert von hathor ( 2. Jul 2015 um 13:50 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#4

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

  Alt 2. Jul 2015, 14:41
Mit LAZARUS 1.4.0 getestet:
Funktioniert mit einem USB-Stick, aber nicht mit einer Speicherkarte.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

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

  Alt 2. Jul 2015, 16:48
Bei meinem Notebook wird die SD-Card (POPPSTAR 32GB) erkannt.

Geändert von hathor ( 2. Jul 2015 um 16:51 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#6

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

  Alt 2. Jul 2015, 17:50
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

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

  Alt 2. Jul 2015, 21:23
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;
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.
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