![]() |
Frage zu WM_DEVICECHANGE
Hallo
Ich brauche mal eure Hilfe! Ich will erkennen, wann ein USB Stick oder eine USB Festplatte angeschlossen wird. Bei Swissdelphi hab ich folgenden code gefunden: ![]() ich verstehe das allerdings nicht so ganz. Wie kann ich jetzt genau auf den wechsel eines USB Laufwerk reagieren? MFG |
Re: Frage zu WM_DEVICECHANGE
1. Speichere den Quelltext als U_Usb.pas
3. Füge den Quelltext unten in die Unit ein. Die Punkte sind der Platzhalter für den Code von der Unit. 2. Füge die Komponente hinzu. Menü Komponente -> Komponente hinzufügen. Wähle dort die Unit aus. 3. Compiliere und Installiere das Paket 4. Die Kompoente kannst du nun in eine Form einfügen. (Reiter ComponentUSB) 5. Im Objektinspektor kannst du unter Reiter: Ereignisse die beiden Ereignisse verwende, um USB Verbindungen zu erkennen.
Delphi-Quellcode:
interface ... procedure Register; implementation ... procedure Register; begin RegisterComponents('ComponentUSB',[TComponentUSB]); end; end. |
Re: Frage zu WM_DEVICECHANGE
ach so geht das^^
ja gut danke erstmal werds mal versuchen..unter delphi 2007 is das n bisschen anders..muss ich mal gucken |
Re: Frage zu WM_DEVICECHANGE
Ich habe das als Komponente installiert. Ich kann es auch verwenden indem ich eine MessageBox ausgebe, das ein Gerät eingesteckt ist oder nicht. Aber wie und wo Frage ich mit dieser Komponente den Hardwaretyp ab, was ich gerade in den USB Port gesteckt habe (z.B. Drucker, USB-Massenspeicher oder oder oder) ?
|
Re: Frage zu WM_DEVICECHANGE
Geil es hat so geklappt wie du beschrieben hast! Musste bei Delphi 2007 allerdings erst n neues Package anfangen und dann die unit da einbinden um das installieren zu können aber funzt jez super!
Besten Dank! Ich glaube erkennen kann man damit nicht, ob es sich um ein USB laufwerk handelt oder nicht. Der reagiert auf alles was in den USB port gesteckt wird! Gruß |
AW: Frage zu WM_DEVICECHANGE
hi, ich bekomme die pas irgendwie nicht in mein Delphi XE.
Es wird zwar gesagt dass die Installation ergfolgreich war und die bpl erzeugt wurde, aber bei meinen komponenten taucht sie nirgends auf. Ich habe ein neues Package erstellt. Unbenannt in "ComponentUSB". Rechtsklick auf Projektname > "Add" > "u_USB.pas" ausgewählt Rechtsklick auf Projektname > Install --------------------------- Information --------------------------- Package C:\Users\Public\Documents\RAD Studio\8.0\Bpl\ComponentUSB.bpl has been installed. --------------------------- OK --------------------------- Leider erscheint keine Komponente in der Tool Palette... Was hab ich denn falsch gemacht? Kann mir das einer sagen?^^ u_USB.pas enthält bereits Register / ComponentUSB ganz unten
Delphi-Quellcode:
// Component to detect when usb devices are connected or disconnected
// using RegisterDeviceNotification unit u_USB; interface uses Windows, Messages, SysUtils, Classes, Forms; type PDevBroadcastHdr = ^DEV_BROADCAST_HDR; DEV_BROADCAST_HDR = packed record dbch_size: DWORD; dbch_devicetype: DWORD; dbch_reserved: DWORD; end; PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE; DEV_BROADCAST_DEVICEINTERFACE = record dbcc_size: DWORD; dbcc_devicetype: DWORD; dbcc_reserved: DWORD; dbcc_classguid: TGUID; dbcc_name: short; 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 type TComponentUSB = class(TComponent) private FWindowHandle: HWND; FOnUSBArrival: TNotifyEvent; FOnUSBRemove: TNotifyEvent; procedure WndProc(var Msg: TMessage); function USBRegister: Boolean; protected procedure WMDeviceChange(var Msg: TMessage); dynamic; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival; property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove; end; implementation constructor TComponentUSB.Create(AOwner: TComponent); begin inherited Create(AOwner); FWindowHandle := AllocateHWnd(WndProc); USBRegister; end; destructor TComponentUSB.Destroy; begin DeallocateHWnd(FWindowHandle); inherited Destroy; end; procedure TComponentUSB.WndProc(var Msg: TMessage); begin if (Msg.Msg = WM_DEVICECHANGE) then begin try WMDeviceChange(Msg); except Application.HandleException(Self); end; end else Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam); end; procedure TComponentUSB.WMDeviceChange(var Msg: TMessage); var devType: Integer; Datos: PDevBroadcastHdr; begin if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then begin Datos := PDevBroadcastHdr(Msg.lParam); devType := Datos^.dbch_devicetype; if devType = DBT_DEVTYP_DEVICEINTERFACE then begin // USB Device if Msg.wParam = DBT_DEVICEARRIVAL then begin if Assigned(FOnUSBArrival) then FOnUSBArrival(Self); end else begin if Assigned(FOnUSBRemove) then FOnUSBRemove(Self); end; end; end; end; function TComponentUSB.USBRegister: Boolean; var dbi: DEV_BROADCAST_DEVICEINTERFACE; Size: Integer; r: Pointer; begin Result := False; Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE); 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 := 0; r := RegisterDeviceNotification(FWindowHandle, @dbi, DEVICE_NOTIFY_WINDOW_HANDLE ); if Assigned(r) then Result := True; end; procedure Register; begin RegisterComponents('ComponentUSB',[TComponentUSB]); end; end. |
AW: Frage zu WM_DEVICECHANGE
Hab eine andere Komponente gefunden die über die Windows API arbeitet:
Diese Lösung ist SD-Karten (-Gerät) kompatibel !!! 1. Auf dieser Seite ( ![]() 2. In Delphi die enthaltene PAS Datei installieren (Components > Install Component > ...) 3. Neues Projekt anlegen 4. Die neue Komponente auf die Form ziehen (Custom > TSHChangeNotify) 5. Im OnCreate der Form folgendes einfügen "SHChangeNotify1.Execute;" 6. Im OnClose und im OnDestroy der Form folgendes einfügen "SHChangeNotify1.Stop;" 7. Jetzt könnt ihr so einige Dinge mit dem Teil auslesen lassen Ein Beispiel Projekt findet ihr auch auf der obigen Seite ( ![]() hier mal eine Liste in der mal teilweise ja schon ableiten kann was da geht:
Code:
mfg
property OnAssocChanged : TTwoParmEvent read fAssocChanged write fAssocChanged;
property OnAttributes : TOneParmEvent read fAttributes write fAttributes; property OnCreate : TOneParmEvent read fCreate write fCreate; property OnDelete : TOneParmEvent read fDelete write fDelete; property OnDriveAdd : TOneParmEvent read fDriveAdd write fDriveAdd; property OnDriveAddGUI : TOneParmEvent read fDriveAddGUI write fDriveAddGUI; property OnDriveRemoved : TOneParmEvent read fDriveRemoved write fDriveRemoved; property OnMediaInserted : TOneParmEvent read fMediaInserted write fMediaInserted; property OnMediaRemoved : TOneParmEvent read fMediaRemoved write fMediaRemoved; property OnMkDir : TOneParmEvent read fMkDir write fMkDir; property OnNetShare : TOneParmEvent read fNetShare write fNetShare; property OnNetUnshare : TOneParmEvent read fNetUnshare write fNetUnshare; property OnRenameFolder : TTwoParmEvent read fRenameFolder write fRenameFolder; property OnRenameItem : TTwoParmEvent read fRenameItem write fRenameItem; property OnRmDir : TOneParmEvent read fRmDir write fRmDir; property OnServerDisconnect : TOneParmEvent read fServerDisconnect write fServerDisconnect; property OnUpdateDir : TOneParmEvent read fUpdateDir write fUpdateDir; property OnUpdateImage : TOneParmEvent read fUpdateImage write fUpdateImage; property OnUpdateItem : TOneParmEvent read fUpdateItem write fUpdateItem; property OnEndSessionQuery : TEndSessionQueryEvent |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 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