![]() |
Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Hallo,
habe folgenden Code halb gefunden, halb ergänzt um zu erkennen wann ein USB-Stick oder SD-Card ein- oder herausgekommen werden. Das ganze ist etwas anders geschrieben, als viele Beispiele hier zu diesem Thema, da die LCL von Lazarus nicht alle Messages vom OS an die Anwendung weiterleitet. Nun möchte ich fragen, ob sich das ganze jemand anschauen kann, um eventuelle Fehler zu beseitigen oder das ganze irgendwie einfacher zu schreiben. Vielen, vielen Dank!
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Windows; type { TForm1 } TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { private declarations } public { public declarations } end; const GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}'; DBT_DEVICEARRIVAL = $8000; // system detected a new device DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class DBT_DEVTYP_VOLUME = $00000002; var Form1: TForm1; implementation uses JwaWinUser, JwaDbt; {$R *.lfm} type TMWndProc = Windows.WNDPROC; var OldWndProc: TMWndProc; function MyWndProc(my_wnd : HWND; Msg : UINT; my_wparam : WPARAM; my_lparam : LPARAM): LRESULT; stdcall; var devType : Integer; Datos : PDevBroadcastHdr; begin Result := 0; case Msg of WM_DEVICECHANGE: begin if (my_wparam = DBT_DEVICEARRIVAL) or (my_wparam = DBT_DEVICEREMOVECOMPLETE) then begin Datos := PDevBroadcastHdr(Pointer(my_lparam)); devType := Datos^.dbch_devicetype; if devType = DBT_DEVTYP_VOLUME then begin if my_wparam = DBT_DEVICEARRIVAL then ShowMessage('USB-Gerät eingesteckt!') else ShowMessage('USB-Gerät herausgenommen!'); end; end; // Return TRUE to grant the request // Return BROADCAST_QUERY_DENY to deny the request. // Weiß nicht genau was ich hier zurück geben soll end; // WM_DEVICECHANGE end; // case Result := Windows.CallWindowProc(OldWndProc, my_wnd, Msg, my_wparam, my_lparam); end; { TForm1 } procedure TForm1.FormCreate(Sender: TObject); var dbi: DEV_BROADCAST_DEVICEINTERFACE_W; dbv: DEV_BROADCAST_VOLUME; Size: Integer; RDN: HDEVNOTIFY; arr : array[0 .. 0] of word; begin arr[0] := 0; Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE_W); ZeroMemory(@dbi, Size); dbi.dbcc_size := Size; dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE; dbi.dbcc_reserved := 0; dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE; dbi.dbcc_name := arr; RDN := RegisterDeviceNotificationW(Form1.Handle, @dbi, DEVICE_NOTIFY_WINDOW_HANDLE); if not Assigned(RDN) then ShowMessage('Error Register Message'); Size := SizeOf(DEV_BROADCAST_VOLUME); ZeroMemory(@dbv, Size); dbv.dbcv_size := Size; dbv.dbcv_devicetype := DBT_DEVTYP_VOLUME; dbv.dbcv_reserved := 0; dbv.dbcv_flags := 0; RDN := RegisterDeviceNotification(Form1.Handle, @dbi, DEVICE_NOTIFY_WINDOW_HANDLE); if not Assigned(RDN) then ShowMessage('Error Register Message'); OldWndProc := TMWndProc(Windows.GetWindowLong(Self.Handle, GWL_WNDPROC)); Windows.SetWindowLong(Self.Handle, GWL_WNDPROC, LongInt(@MyWndProc)); end; end. |
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
MfG Dalai |
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Danke Dir, so sieht's nun aus:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var dbi: DEV_BROADCAST_DEVICEINTERFACE_W; dbv: DEV_BROADCAST_VOLUME; Size: Integer; RDN: HDEVNOTIFY; arr : array[0 .. 0] of word; begin arr[0] := 0; Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE_W); ZeroMemory(@dbi, Size); dbi.dbcc_size := Size; dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE; dbi.dbcc_reserved := 0; dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE; dbi.dbcc_name := arr; RDN := RegisterDeviceNotificationW(Self.Handle, @dbi, DEVICE_NOTIFY_WINDOW_HANDLE); if not Assigned(RDN) then ShowMessage('1: ' + SysErrorMessage(GetLastError)); Size := SizeOf(DEV_BROADCAST_VOLUME); ZeroMemory(@dbv, Size); dbv.dbcv_size := Size; dbv.dbcv_devicetype := DBT_DEVTYP_VOLUME; dbv.dbcv_reserved := 0; dbv.dbcv_flags := 0; RDN := RegisterDeviceNotification(Self.Handle, @dbv, DEVICE_NOTIFY_WINDOW_HANDLE); if not Assigned(RDN) then ShowMessage('2: ' + SysErrorMessage(GetLastError)); OldWndProc := TMWndProc(Windows.GetWindowLong(Self.Handle, GWL_WNDPROC)); Windows.SetWindowLong(Self.Handle, GWL_WNDPROC, LongInt(@MyWndProc)); end; Die Zeile Zitat:
Zitat:
|
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Man könnte jetzt über die Bedeutung des Wortes Fehlercode philosophieren. :roll:
|
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Zitat:
|
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Nur eine Vermutung: Vielleicht musst du
Code:
noch setzen?
dbcv_unitmask
The logical unit mask identifying one or more logical units. Each bit in the mask corresponds to one logical drive. Bit 0 represents drive A, bit 1 represents drive B, and so on. Übrigens: bei reserved-Parametern sollte man aufpassen und diese besser gar nicht anfassen. Auch wenn sich durch deine Zuweisung wahrscheinlich nichts ändert, würde ich sie komplett weglassen. Bist du sicher, dass Lazarus keine WM_DEVICECHANGE Nachrichten verarbeitet? Wenn es das tut, könnte dies helfen: ![]() ![]() MfG Dalai |
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Zitat:
Zitat:
Zitat:
Ich überlege schon lieber mit nem Timer zu arbeiten, der alle x Sekunden nach Laufwerken Umschau hält, denn alles andere wird so langsam kompliziert und instabil. |
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Zitat:
Zitat:
MfG Dalai |
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
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; |
AW: Erkennen, ob USB-Stick oder SD-Card eingesteckt oder herausgenommen?
Zitat:
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 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