![]() |
Re: USB Stick erkennen
Delphi-Quellcode:
Wobei Du "TFenster" natürlich durch den Namen Deiner Form ersetzen musst. Im implementation-Teil der Unit dann halt den Code von oben (mit ersetztem Pan ;) ) einsetzen.
type TFenster = class(TForm)
... private procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE; ... end; |
Re: USB Stick erkennen
Schau mal, ob Dir ansonsten das das weiterhilft:
![]() |
Re: USB Stick erkennen
Hey
Das mit dem
Delphi-Quellcode:
hatte ich mir schon gedacht, aber das Message hatte ich vergessen.
private
procedure WMDeviceChange(var Msg: TMessage); Naja wie gesagt, ihr seid echt spitze :zwinker: :party: :party: :party: !!! |
Re: USB Stick erkennen
Ich habe den obigen Sourcecode mal Formatiert und "nachgebessert".
Soweit funktioniert die Erkennung des USB-Sticks bis auf die im Quelltext gekennz. Stelle. dbcv_flags ergibt immer bei mir den Wert "0" unter Vista, auch im original von oben. Hat jmd. eine Ahnung woran das liegen kann ?
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, LinkLabel; type TForm1 = class(TForm) Label1: TLabel; private { Private-Deklarationen } procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} const DBT_DEVICEARRIVAL = $8000; // A device or piece of media has been inserted and is now available. DBT_DEVICEQUERYREMOVE = $8001; // Permission is requested to remove a device or piece of media. Any application can deny this request and cancel the removal. DBT_DEVICEQUERYREMOVEFAILED = $8002; // A request to remove a device or piece of media has been canceled. DBT_DEVICEREMOVECOMPLETE = $8004; // A device or piece of media has been removed. DBT_DEVTYP_VOLUME = $00000002; // Logical volume. This structure is a DEV_BROADCAST_VOLUME structure. DBTF_MEDIA = $0001; // Change affects media in drive. If not set, change affects physical device or drive. DBTF_NET = $0002; // Indicated logical volume is a network volume. type PDevBroadcastHdr = ^TDevBroadcastHdr; TDevBroadcastHdr = packed record dbcd_size: DWORD; dbcd_devicetype: DWORD; dbcd_reserved: DWORD; end; PDevBroadcastVolume = ^TDevBroadcastVolume; TDevBroadcastVolume = packed record dbcv_size: DWORD; dbcv_devicetype: DWORD; dbcv_reserved: DWORD; dbcv_unitmask: DWORD; dbcv_flags: Word; end; procedure TForm1.WMDeviceChange(var Msg: TMessage); var Drive: String; function GetDrive(pDBVol: PDevBroadcastVolume): string; var i: Byte; Maske: DWORD; DevBroadcastVolume: TDevBroadcastVolume; begin DevBroadcastVolume := pDBVol^; // for Debug if (pDBVol^.dbcv_flags and DBTF_MEDIA) = DBTF_MEDIA then // <--<< begin Maske := pDBVol^.dbcv_unitmask; for i := 0 to 25 do begin if (Maske and 1) = 1 then Result := Char(i + Ord('A')) + ': '; Maske := Maske shr 1; end; end; end; begin case Msg.wParam of DBT_DEVICEARRIVAL: if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DEVTYP_VOLUME then Label1.Caption := 'Datenträger in Laufwerk '+ GetDrive(PDevBroadcastVolume(Msg.lParam))+'eingelegt'; DBT_DEVICEREMOVECOMPLETE: if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DEVTYP_VOLUME then begin Drive := GetDrive(PDevBroadcastVolume(Msg.lParam)); Label1.Caption := 'Datenträger aus Laufwerk '+Drive+'entfernt'; end; end; end; end. |
Re: USB Stick erkennen
Ich benutze den
![]()
Delphi-Quellcode:
Funktioniert wunderbar mit USB-Sticks und USB-Festplatten.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; private { Private declarations } public procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WMDeviceChange(var Msg: TMessage); type PDevBroadcastHdr = ^TDevBroadcastHdr; TDevBroadcastHdr = packed record dbcd_size, dbcd_devicetype, dbcd_reserved: DWORD; end; PDevBroadcastVolume = ^TDevBroadcastVolume; TDevBroadcastVolume = packed record dbcv_size, dbcv_devicetype, dbcv_reserved, dbcv_unitmask: DWORD; dbcv_flags: Word; end; function GetDrive(pDBVol: PDevBroadcastVolume): string; var i: Byte; Maske: DWORD; begin if (pDBVol^.dbcv_flags and $0001) = $0001 then begin Maske := pDBVol^.dbcv_unitmask; for i := 0 to 25 do begin if (Maske and 1) = 1 then Result := Char(i + Ord('A')) + ': '; Maske := Maske shr 1; end; end; end; var Drive: String; begin case Msg.wParam of $8000: if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = $0002 then Label1.Caption := 'Datenträger in Laufwerk '+GetDrive(PDevBroadcastVolume(Msg.lParam))+'eingelegt'; $8004: if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = $0002 then begin Drive := GetDrive(PDevBroadcastVolume(Msg.lParam)); Label1.Caption := 'Datenträger aus Laufwerk '+Drive+'entfernt'; if not(Drive = '') and (Drive[1] = ExtractFilePath(ParamStr(0))[1]) then Close; end; end; end; end. |
Re: USB Stick erkennen
also 'ne Angabe daß sich bunter Vista was geändert hat, steht nicht da
![]() aber es werden anscheinend dennoch viele Nachrichten nicht mehr oder anders versendet (ich erinner mich da böse an die Standby/Hibernation-Nachrichten :wall: ) der Code erinnert mich auch Stark an diesen zur CD-Erkennung: ![]() vielleicht sollte man auch noch 'ne Prüfung des Laufwerktyps einbauen, nicht daß man hier ausvershen noch von CDs, DVDs und USB-Festplatten und anderen Speicherkarten erschlagen wird. |
Re: USB Stick erkennen
Ich benutze den Sourcecode aus meinem letzten Posting in meinem Programm
![]() |
AW: USB Stick erkennen
wie genau benutzt man denn die unit von den schweizern?
![]() |
AW: USB Stick erkennen
Instanz erzeugen und den beiden Events einen TNotifyEvent zuweisen.
|
AW: USB Stick erkennen
mein einziges problem ist:
wie sieht der aufbau eines solchen TNotifyEvents aus? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 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