Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kein WParam in WM_DEVICECHANGE bei bestimmter Hardware (https://www.delphipraxis.net/27943-kein-wparam-wm_devicechange-bei-bestimmter-hardware.html)

sieppl 17. Aug 2004 16:53


Kein WParam in WM_DEVICECHANGE bei bestimmter Hardware
 
Hallo,

ich versuche meine Digitalkamera automatisch erkennen zu lassen (via WM_DEVICECHANGE9
und ggfs. die fotos in einen ordner kopieren zu lassen.
Das Programm funktioniert sehr gut mit allen Medien die im Arbeitsplatz mit einem
Laufwerksbuchstaben gemountet werden. Manche Digital-Kameras werden dagegen als
virtuelles Laufwerk gemountet. (z.B. Canon Powershot S45), zu erkennen an dem
kleinem Kamera-Icon was beim anschließen erscheint.
Komischerweise ist dann der Parameter wParam leer und lParam enthält keinen Pointer auf
nähere Informationen.
Ich bin mittlerweile ein wenig verzweifelt, da ich jetzt 3 Tage das Internet durchsuche
und jetzt im 3. großen Delphi-Forum poste, da ich bisher nicht eine einzige Antwort
bekommen habe.

Vielleicht finde ich den Experten..

Grüße

Sebastian

Code:
this one uses the same variable names for the Message-Struct like described in the API-Reference:

procedure TForm1.WMDEVICECHANGE(var Msg: TMsg);
var
  MsgType: String;
  Filter: PDevBroadcastVolume;
  lpdb: PDEVBROADCASTHDR;
  Volume: String;
begin
  lpdb := PDEVBROADCASTHDR(Msg.lParam);
  if assigned(lpdb) then
  begin
    case lpdb^.dbch_devicetype of
      DBT_DEVTYP_OEM: MsgType := 'OEM- or IHV-defined';
      DBT_DEVTYP_DEVNODE: MsgType := 'Devnode number';
      DBT_DEVTYP_VOLUME: MsgType := 'Logical volume';
      DBT_DEVTYP_PORT: MsgType := 'Port (serial or parallel';
      DBT_DEVTYP_NET: MsgType := 'Network resource';
      DBT_DEVTYP_DEVICEINTERFACE: MsgType := 'DEVTYP_DEVICEINTERFACE';
      DBT_DEVTYP_HANDLE: MsgType := 'DEVTYP_HANDLE';
      DBT_DEVNODES_CHANGED: MsgType := 'DBT_DEVNODES_CHANGED';
    else MsgType := 'Unkown DeviceType' + IntToStr(lpdb^.dbch_devicetype);
    end;
  end;
  Memo1.Lines.Add(MsgType);
 
  case Msg.wParam of
    DBT_DEVICEARRIVAL: MsgType := 'DBT_DEVICEARRIVAL';
    DBT_DEVICEQUERYREMOVE: MsgType := 'DBT_DEVICEQUERYREMOVE';
    DBT_DEVICEQUERYREMOVEFAILED: MsgType := 'DBT_DEVICEQUERYREMOVEFAILED';
    DBT_DEVICEREMOVEPENDING: MsgType := 'DBT_DEVICEREMOVEPENDING';
    DBT_DEVICEREMOVECOMPLETE: MsgType := 'DBT_DEVICEREMOVECOMPLETE';
    DBT_DEVICETYPESPECIFIC: MsgType := 'DBT_DEVICETYPESPECIFIC';
    DBT_CONFIGCHANGED: MsgType := 'DBT_CONFIGCHANGED';
    else MsgType := 'Unknown event ' + IntToHex(Msg.wParam, 0);
  end;
  Memo1.Lines.Add('Msg: ' + IntToStr(Msg.message));
  Memo1.Lines.Add('Event: ' + IntToStr(Msg.wParam));
  Memo1.Lines.Add('Result: ' + IntToStr(Msg.lParam));
  if Msg.lParam > 0 then
  begin
    Filter:= @Msg.lParam;
    Volume:= DetermineVolume(Filter^.dbcv_unitmask);
    MsgType := MsgType + ' ' + Volume +
      ' '+ IntToSTr(Filter^.dbcv_flags);
    Memo1.Lines.Add(MsgType);
  end;
  if Msg.wParam = DBT_DEVICEARRIVAL then
  begin
    //do something
  end;
end;

sieppl 20. Aug 2004 19:41

Re: Kein WParam in WM_DEVICECHANGE bei bestimmter Hardware
 
Korrekte Antwort wäre gewesen: RegisterDeviceNotification vorher auszuführen. Dann bekommt man wenigstens mit, dass die Kamera sich als DeviceInterface anmeldet..


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 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