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 hier im Forum zu finden ist. Das klappt auch wunderbar! Nur wenn ich das auf eine Komponente übertrage, dann wird nicht in die Prozedur reingesprungen. Woran kann das liegen? Gibts es da noch etwas das man beachten muss wenn man Windows Messages mit eigenen Kompos benutzt?
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 00:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz