![]() |
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. |
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Zitat:
|
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Bei meinem Notebook wird die SD-Card (POPPSTAR 32GB) erkannt.
|
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Zitat:
Es wird also kein Laufwerk erzeugt, wenn eine Karte eingesteckt wird und kein Laufwerk entfernt, wenn die Karte herausgenommen wird. |
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; |
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. |
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.
|
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
![]() |
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Zitat:
|
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15: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