Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eigene Komponente - WM_DEVICECHANGE wird nicht mitbekommen (https://www.delphipraxis.net/116493-eigene-komponente-wm_devicechange-wird-nicht-mitbekommen.html)

Tormentor32 30. Jun 2008 15:03


Eigene Komponente - WM_DEVICECHANGE wird nicht mitbekommen
 
Hallo erstmal ;)

Ich bin dabei eine Komponente zu schreiben, die zwei Events beinhaltet, nämlich
Delphi-Quellcode:
OnUSBStickPluggedIn
und
Delphi-Quellcode:
OnUSBStickPluggedOut
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?

Hier mal der (abgespeckte) Code meiner Komponente:
Delphi-Quellcode:
//...
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.
Vielleicht ist es ja nur ein blöder Denkfehler aber ich sitz jetzt seit Stunden da dran :(

Wenn jemand eine Idee hat, nur zu! :)

Vielen Dank,

Gruß Ritsch!

Apollonius 30. Jun 2008 15:08

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.

Tormentor32 30. Jun 2008 15:29

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