![]() |
Eigene Komponente - WM_DEVICECHANGE wird nicht mitbekommen
Hallo erstmal ;)
Ich bin dabei eine Komponente zu schreiben, die zwei Events beinhaltet, nämlich
Delphi-Quellcode:
und
OnUSBStickPluggedIn
Delphi-Quellcode:
Zuerst habe ich ein Testprogramm geschrieben welches sich der Methode bedient, die auch
OnUSBStickPluggedOut
![]() Hier mal der (abgespeckte) Code meiner Komponente:
Delphi-Quellcode:
Vielleicht ist es ja nur ein blöder Denkfehler aber ich sitz jetzt seit Stunden da dran :(
//...
type TUSBStickEvent = procedure(const ADrive: Char) of object; TUSBHandler = class(TComponent) private //... FOnPluggedIn: TUSBStickEvent; FOnPluggedOut: TUSBStickEvent; procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE; published property OnPluggedIn: TUSBStickEvent read FOnPluggedIn write FOnPluggedIn; property OnPluggedOut: TUSBStickEvent read FOnPluggedOut write FOnPluggedOut; //... end; procedure Register; implementation { TUSBHandler } //... constructor TUSBHandler.Create(AOwner: TComponent); begin inherited; //... end; //... procedure TUSBHandler.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; var ChangedDrive: Char; begin //hier kommt er nie an! case Msg.wParam of $8000: if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = $0002 then begin //Vorher Laufwerkbuchstaben ermitteln... if Assigned(FOnPluggedIn) then OnPluggedIn(ChangedDrive); end; $8004: if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = $0002 then begin //Vorher Laufwerkbuchstaben ermitteln... if Assigned(FOnPluggedIn) then OnPluggedIn(ChangedDrive); end; end; end; procedure Register; begin RegisterComponents('USB Tools', [TUSBHandler]); end; end. Wenn jemand eine Idee hat, nur zu! :) Vielen Dank, Gruß Ritsch! |
Re: Eigene Komponente - WM_DEVICECHANGE wird nicht mitbekomm
Damit Windows dir Nachrichten schickt, brauchst du ein Fensterhandle. :cyclops:
Schau dir mal den Quellcode von TTimer an, da siehst du wie es gemacht wird: Mit AllocateWnd erhältst du ein neues Fensterhandle aus einer VCL-Fenster-Methode. In dieser verwirfst du alle Nachrichten außer WM_DEVICECHANGE. Im Destruktor zerstörst du das Handle mit DeallocateWnd. |
Re: Eigene Komponente - WM_DEVICECHANGE wird nicht mitbekomm
Genau das wars, vielen Dank!
Blöd wenn man sowas nicht weiß :-/ Jetzt bin ich schlauer :mrgreen: Vielen Dank, Gruß Ritsch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 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