AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Eigene Komponente - WM_DEVICECHANGE wird nicht mitbekommen
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Komponente - WM_DEVICECHANGE wird nicht mitbekommen

Ein Thema von Tormentor32 · begonnen am 30. Jun 2008 · letzter Beitrag vom 30. Jun 2008
Antwort Antwort
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
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Eigene Komponente - WM_DEVICECHANGE wird nicht mitbekomm

  Alt 30. Jun 2008, 15:08
Damit Windows dir Nachrichten schickt, brauchst du ein Fensterhandle.
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Tormentor32
Tormentor32

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

Re: Eigene Komponente - WM_DEVICECHANGE wird nicht mitbekomm

  Alt 30. Jun 2008, 15:29
Genau das wars, vielen Dank!

Blöd wenn man sowas nicht weiß :-/

Jetzt bin ich schlauer

Vielen Dank, Gruß Ritsch
Richard Mahr
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:15 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