AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu WM_DEVICECHANGE

Ein Thema von delphin06 · begonnen am 8. Apr 2007 · letzter Beitrag vom 22. Aug 2012
Antwort Antwort
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#1

Frage zu WM_DEVICECHANGE

  Alt 8. Apr 2007, 17:46
Hallo

Ich brauche mal eure Hilfe!

Ich will erkennen, wann ein USB Stick oder eine USB Festplatte angeschlossen wird. Bei Swissdelphi hab ich folgenden code gefunden:

http://www.swissdelphicenter.ch/de/showcode.php?id=2211

ich verstehe das allerdings nicht so ganz. Wie kann ich jetzt genau auf den wechsel eines USB Laufwerk reagieren?

MFG
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#2

Re: Frage zu WM_DEVICECHANGE

  Alt 8. Apr 2007, 19:04
1. Speichere den Quelltext als U_Usb.pas
3. Füge den Quelltext unten in die Unit ein. Die Punkte sind der Platzhalter für den Code von der Unit.
2. Füge die Komponente hinzu. Menü Komponente -> Komponente hinzufügen. Wähle dort die Unit aus.
3. Compiliere und Installiere das Paket
4. Die Kompoente kannst du nun in eine Form einfügen. (Reiter ComponentUSB)
5. Im Objektinspektor kannst du unter Reiter: Ereignisse die beiden Ereignisse verwende, um USB Verbindungen zu erkennen.


Delphi-Quellcode:

interface
...
procedure Register;

implementation
...
procedure Register;
begin
  RegisterComponents('ComponentUSB',[TComponentUSB]);
end;

end.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#3

Re: Frage zu WM_DEVICECHANGE

  Alt 8. Apr 2007, 19:38
ach so geht das^^
ja gut danke erstmal werds mal versuchen..unter delphi 2007 is das n bisschen anders..muss ich mal gucken
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#4

Re: Frage zu WM_DEVICECHANGE

  Alt 8. Apr 2007, 21:18
Ich habe das als Komponente installiert. Ich kann es auch verwenden indem ich eine MessageBox ausgebe, das ein Gerät eingesteckt ist oder nicht. Aber wie und wo Frage ich mit dieser Komponente den Hardwaretyp ab, was ich gerade in den USB Port gesteckt habe (z.B. Drucker, USB-Massenspeicher oder oder oder) ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#5

Re: Frage zu WM_DEVICECHANGE

  Alt 9. Apr 2007, 12:56
Geil es hat so geklappt wie du beschrieben hast! Musste bei Delphi 2007 allerdings erst n neues Package anfangen und dann die unit da einbinden um das installieren zu können aber funzt jez super!

Besten Dank!


Ich glaube erkennen kann man damit nicht, ob es sich um ein USB laufwerk handelt oder nicht. Der reagiert auf alles was in den USB port gesteckt wird!

Gruß
  Mit Zitat antworten Zitat
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#6

AW: Frage zu WM_DEVICECHANGE

  Alt 18. Aug 2012, 15:28
hi, ich bekomme die pas irgendwie nicht in mein Delphi XE.
Es wird zwar gesagt dass die Installation ergfolgreich war und die bpl erzeugt wurde, aber bei meinen komponenten taucht sie nirgends auf.

Ich habe ein neues Package erstellt.
Unbenannt in "ComponentUSB".
Rechtsklick auf Projektname > "Add" > "u_USB.pas" ausgewählt
Rechtsklick auf Projektname > Install

---------------------------
Information
---------------------------
Package C:\Users\Public\Documents\RAD Studio\8.0\Bpl\ComponentUSB.bpl has been installed.
---------------------------
OK
---------------------------

Leider erscheint keine Komponente in der Tool Palette...
Was hab ich denn falsch gemacht? Kann mir das einer sagen?^^




u_USB.pas
enthält bereits Register / ComponentUSB ganz unten
Delphi-Quellcode:
// Component to detect when usb devices are connected or disconnected
// using RegisterDeviceNotification

unit u_USB;

interface

uses
  Windows, Messages, SysUtils, Classes, Forms;

type

  PDevBroadcastHdr = ^DEV_BROADCAST_HDR;
  DEV_BROADCAST_HDR = packed record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
  end;

  PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE;
  DEV_BROADCAST_DEVICEINTERFACE = record
    dbcc_size: DWORD;
    dbcc_devicetype: DWORD;
    dbcc_reserved: DWORD;
    dbcc_classguid: TGUID;
    dbcc_name: short;
  end;

const
  GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
  DBT_DEVICEARRIVAL = $8000; // system detected a new device
  DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
  DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class

type

  TComponentUSB = class(TComponent)
  private
    FWindowHandle: HWND;
    FOnUSBArrival: TNotifyEvent;
    FOnUSBRemove: TNotifyEvent;
    procedure WndProc(var Msg: TMessage);
    function USBRegister: Boolean;
  protected
    procedure WMDeviceChange(var Msg: TMessage); dynamic;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
    property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
  end;

implementation

constructor TComponentUSB.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FWindowHandle := AllocateHWnd(WndProc);
  USBRegister;
end;

destructor TComponentUSB.Destroy;
begin
  DeallocateHWnd(FWindowHandle);
  inherited Destroy;
end;

procedure TComponentUSB.WndProc(var Msg: TMessage);
begin
  if (Msg.Msg = WM_DEVICECHANGE) then
  begin
    try
      WMDeviceChange(Msg);
    except
      Application.HandleException(Self);
    end;
  end
  else
    Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;

procedure TComponentUSB.WMDeviceChange(var Msg: TMessage);
var
  devType: Integer;
  Datos: PDevBroadcastHdr;
begin
  if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
  begin
    Datos := PDevBroadcastHdr(Msg.lParam);
    devType := Datos^.dbch_devicetype;
    if devType = DBT_DEVTYP_DEVICEINTERFACE then
    begin // USB Device
      if Msg.wParam = DBT_DEVICEARRIVAL then
      begin
        if Assigned(FOnUSBArrival) then
          FOnUSBArrival(Self);
      end
      else
      begin
        if Assigned(FOnUSBRemove) then
          FOnUSBRemove(Self);
      end;
    end;
  end;
end;

function TComponentUSB.USBRegister: Boolean;
var
  dbi: DEV_BROADCAST_DEVICEINTERFACE;
  Size: Integer;
  r: Pointer;
begin
  Result := False;
  Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
  ZeroMemory(@dbi, Size);
  dbi.dbcc_size := Size;
  dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  dbi.dbcc_reserved := 0;
  dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
  dbi.dbcc_name := 0;

  r := RegisterDeviceNotification(FWindowHandle, @dbi,
    DEVICE_NOTIFY_WINDOW_HANDLE
    );
  if Assigned(r) then Result := True;
end;

procedure Register;
begin
  RegisterComponents('ComponentUSB',[TComponentUSB]);
end;

end.
  Mit Zitat antworten Zitat
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#7

AW: Frage zu WM_DEVICECHANGE

  Alt 22. Aug 2012, 19:51
Hab eine andere Komponente gefunden die über die Windows API arbeitet:
Diese Lösung ist SD-Karten (-Gerät) kompatibel !!!

1. Auf dieser Seite (http://delphi.about.com/library/code/ncaa030403b.htm) das herunterladen: Download the TSHChangeNotify component with source.
2. In Delphi die enthaltene PAS Datei installieren (Components > Install Component > ...)
3. Neues Projekt anlegen
4. Die neue Komponente auf die Form ziehen (Custom > TSHChangeNotify)
5. Im OnCreate der Form folgendes einfügen "SHChangeNotify1.Execute;"
6. Im OnClose und im OnDestroy der Form folgendes einfügen "SHChangeNotify1.Stop;"
7. Jetzt könnt ihr so einige Dinge mit dem Teil auslesen lassen


Ein Beispiel Projekt findet ihr auch auf der obigen Seite (http://delphi.about.com/library/code/ncaa030403b.htm) hinterlegt bei: Download the ZIPed project source.



hier mal eine Liste in der mal teilweise ja schon ableiten kann was da geht:
Code:
    property OnAssocChanged    : TTwoParmEvent read fAssocChanged write fAssocChanged;
    property OnAttributes   : TOneParmEvent read fAttributes  write fAttributes;
    property OnCreate           : TOneParmEvent read fCreate      write fCreate;
    property OnDelete           : TOneParmEvent read fDelete      write fDelete;
    property OnDriveAdd           : TOneParmEvent read fDriveAdd    write fDriveAdd;
    property OnDriveAddGUI   : TOneParmEvent read fDriveAddGUI write fDriveAddGUI;
    property OnDriveRemoved   : TOneParmEvent read fDriveRemoved write fDriveRemoved;
    property OnMediaInserted   : TOneParmEvent read fMediaInserted write fMediaInserted;
    property OnMediaRemoved   : TOneParmEvent read fMediaRemoved write fMediaRemoved;
    property OnMkDir           : TOneParmEvent read fMkDir       write fMkDir;
    property OnNetShare           : TOneParmEvent read fNetShare    write fNetShare;
    property OnNetUnshare   : TOneParmEvent read fNetUnshare  write fNetUnshare;
    property OnRenameFolder   : TTwoParmEvent read fRenameFolder write fRenameFolder;
    property OnRenameItem   : TTwoParmEvent read fRenameItem  write fRenameItem;
    property OnRmDir           : TOneParmEvent read fRmDir       write fRmDir;
    property OnServerDisconnect : TOneParmEvent read fServerDisconnect write fServerDisconnect;
    property OnUpdateDir       : TOneParmEvent read fUpdateDir   write fUpdateDir;
    property OnUpdateImage   : TOneParmEvent read fUpdateImage write fUpdateImage;
    property OnUpdateItem      : TOneParmEvent read fUpdateItem  write fUpdateItem;
    property OnEndSessionQuery : TEndSessionQueryEvent
mfg
  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 17:58 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