Einzelnen Beitrag anzeigen

Benutzerbild von Tormentor32
Tormentor32

Registriert seit: 27. Okt 2005
Ort: Düsseldorf
369 Beiträge
 
Delphi XE5 Professional
 
#1

Eigene Komponente - WM_DEVICECHANGE wird nicht mitbekommen

  Alt 30. Jun 2008, 15:03
Hallo erstmal

Ich bin dabei eine Komponente zu schreiben, die zwei Events beinhaltet, nämlichOnUSBStickPluggedIn undOnUSBStickPluggedOut 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!
Richard Mahr
  Mit Zitat antworten Zitat