AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi "Datenträgerdialog" & Bilder von Datenträger übertragen
Thema durchsuchen
Ansicht
Themen-Optionen

"Datenträgerdialog" & Bilder von Datenträger übertragen

Ein Thema von EConvertError · begonnen am 13. Apr 2007 · letzter Beitrag vom 4. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#1

"Datenträgerdialog" & Bilder von Datenträger ü

  Alt 13. Apr 2007, 17:52
Hallo!

Ich möchte mein Programm gerne in dem im Anhang zu findenen Dialog eintragen. Dieser Dialog erscheint ja immer, wenn man einen Datenträger, wie z.B. USB-Stick od. Kamera (für mich wichtig anschließt).

Natürlich möchte ich mich nicht nur eintragen, sondern mein Programm soll beim Anwählen auch gestartet werden.

Ich möchte genauso wie im Screenshot Bilder von USB-Stick und Kamera auf die Festplatte übertragen.
Wie komme ich da z.B. an die Parameter (Laufwerksbuchstaben) ran?

Der eigentliche Kopiervorgang ist ja bei einem USB-Stick kein Problem, aber vielleicht bei der Kamera: Da gibt es ja allerhand Technologien wie WIA oder TWAIN. Muss ich die verwenden, oder darf ich die Kamera ganz normal als Datenträger behandeln (wäre praktisch)?

Vielen Dank,
Andreas
Angehängte Grafiken
Dateityp: jpg dialog_424.jpg (385,5 KB, 68x aufgerufen)
Andreas N.
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#2

Re: "Datenträgerdialog" & Bilder von Datenträg

  Alt 14. Apr 2007, 18:11
*push*

MSDN-Suchbegriffe, etc. wären auch schon hilfreich. Allerdings weiß ich ja nicht einmal wie der Dialog heißt...

Vielen Dank,
Andreas
Andreas N.
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#3

Re: "Datenträgerdialog" & Bilder von Datenträg

  Alt 17. Apr 2007, 16:46
*push*
Andreas N.
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: "Datenträgerdialog" & Bilder von Datenträg

  Alt 17. Apr 2007, 22:55
Zitat von EConvertError:
Hallo!

Ich möchte mein Programm gerne in dem im Anhang zu findenen Dialog eintragen. Dieser Dialog erscheint ja immer, wenn man einen Datenträger, wie z.B. USB-Stick od. Kamera (für mich wichtig anschließt).

Natürlich möchte ich mich nicht nur eintragen, sondern mein Programm soll beim Anwählen auch gestartet werden.
Moin,

soweit habe ich es zumindest bei mir geschafft, dass bei Bildern mein Programm angezeigt wird und auch gestartet werden kann.
Delphi-Quellcode:
uses
  Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
   Reg : TRegistry;
   ProgPfad: AnsiString;
begin
  ProgPfad:= 'C:\Project1.exe';
  Reg:= TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\EventHandlers\ShowPicturesOnArrival\', true) then
    begin
      Reg.WriteString('MBMyBild','');
      Reg.CloseKey;
    end;

    if Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\Handlers\MBMyBild\', true) then
    begin
    Reg.WriteString('Action','Mein Bild öffnen');
    Reg.WriteString('DefaultIcon',ProgPfad+',0');
    Reg.WriteString('InvokeProgID','My.Bilder');
    Reg.WriteString('InvokeVerb','ShowMyBild');
    Reg.WriteString('Provider','Bild Test');
    Reg.CloseKey;
    end;

    Reg.RootKey := HKEY_CLASSES_ROOT;
    if Reg.OpenKey('\CLSID\{51BD566E-A02D-4387-9A82-D929EA8C20B1}\LocalServer32\', true) then
    begin
      Reg.WriteString('', ProgPfad);
      Reg.CloseKey;
    end;

    if Reg.OpenKey('\CLSID\{51BD566E-A02D-4387-9A82-D929EA8C20B1}\ProgID\', true) then
    begin
      Reg.WriteString('','My.Bilder');
      Reg.CloseKey;
    end;

    if Reg.OpenKey('\My.Bilder\', true) then
    begin
      Reg.WriteString('','My.Bilder');
      Reg.CloseKey;
    end;

    if Reg.OpenKey('\My.Bilder\CLSID\', true) then
    begin
      Reg.WriteString('','{51BD566E-A02D-4387-9A82-D929EA8C20B1}');
      Reg.CloseKey;
    end;

    if Reg.OpenKey('\My.Bilder\Shell\ShowMyBild\DropTarget', true) then
    begin
      Reg.WriteString('CLSID','{51BD566E-A02D-4387-9A82-D929EA8C20B1}');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
   Reg : TRegistry;
begin
  Reg:= TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;

    if Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\EventHandlers\ShowPicturesOnArrival\', false) then
    begin
      Reg.DeleteValue('MBMyBild');
      Reg.CloseKey;
    end;

    if Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\Handlers\', false) then
    begin
      if reg.KeyExists('MBMyBild') then
        Reg.DeleteKey('MBMyBild');
       Reg.CloseKey;
    end;

    Reg.RootKey := HKEY_CLASSES_ROOT;
    if Reg.OpenKey('\CLSID\', false) then
    begin
      if reg.KeyExists('{51BD566E-A02D-4387-9A82-D929EA8C20B1}') then
        Reg.DeleteKey('{51BD566E-A02D-4387-9A82-D929EA8C20B1}');
      Reg.CloseKey;
    end;

    if reg.KeyExists('\My.Bilder\') then
      Reg.DeleteKey('\My.Bilder\');
  finally
    Reg.Free;
  end;
end;
Getestet mit WinXP SP1.

Du kannst dich ja auch selber noch mit der Registry beschäftigen. Unter dem Schlüssel 'SOFTWARE\Microsoft\Windows\CurrentVersion\Explore r\AutoplayHandlers\EventHandlers' konnte man auch noch andere Sachen wie Bilder eintragen.

Ich habe eben gerade nach den Suchbegriff ShowPicturesOnArrival gesucht, eventuell kommst du damit noch weiter.
Miniaturansicht angehängter Grafiken
aktion_165.jpg  
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#5

Re: "Datenträgerdialog" & Bilder von Datenträg

  Alt 21. Apr 2007, 12:35
Vielen Dank für die Antwort!

Ich habe leider aus schulischen Gründen nicht sofort Zeit mich damit zu befassen. Bei eventuellen Fragen werde ich mich wieder melden.

Vielen Dank,
Andreas
Andreas N.
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#6

Re: "Datenträgerdialog" & Bilder von Datenträg

  Alt 30. Apr 2007, 20:37
Vielen Dank noch einmal für die Unterstützung!

Ich hab erstmal herausgefunden, wie ich meine Anwendung registriere, damit ich in der Liste aufscheine.

Mein einziges Problem ist nur noch das reagieren meiner Anwendung auf die Events. Zur Zeit will ich sowieso nur auf volume-basierte Devices zugreifen (die meisten modernen Kameras decke ich damit ja ab).

Zu diesem Zweck habe ich mir diesen Artikel durchgelesen. Jetzt bin ich leider noch nicht ganz der WinAPI-Freak.

Da steht unter anderem:
Zitat:
When Autoplay launches an app in response to a volume-based event, the InvokeProgID and InvokeVerb values are passed to ShellExecuteEx. If the application registered for IDropTarget then all the files that were sniffed will be passed to the application through the IDataObject interface.
Wo anders habe ich das gefunden:
Zitat:
Under ProgID key, the class ID (CLSID) of the COM object that implements the IDropTarget interface must be defined.
Soweit klar, nur wie implementiert man das konkret? Ich muss offensichtlich IDropTarget implementieren. Nur wie funktioniert das? Bis jetzt ist meine Anwendungs zwar für IDropTarget registriert, kann es aber noch gar nicht.
Muss ich da eine Shell-Extension schreiben? Ich steh etwas planlos davor...

Was ich erreichen will ist, dass entweder meine bereits geöffnete Anwendung benachrichtigt wird, oder falls nicht vorhanden, meine Anwendung geöffnet wird.

Da würde sich eine Shell-Extension anbieten oder nicht? Sie bearbeitet die Events und reicht sie an die Hauptanwendung weiter. Nur wie leite ich sie weiter? Oder denke ich völlig falsch?


Und kann ich das IDropTarget-Objekt gleichzeitig dazu verwenden, Dateien vom Explorer per Drag & Drop zu öffnen? Oder sind diese beiden IDropTargets zwei verschiedene paar Schuhe?

Vielen Dank,
Andreas
Andreas N.
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: "Datenträgerdialog" & Bilder von Datenträg

  Alt 1. Mai 2007, 01:13
Hi,

was IDropTarget betrifft hilft dir eventuell dieser Beitrag weiter. Dazu habe ich einfach eine ListBox auf das Form gesetzt und die Unit2 eingebunden. In der Unit2 muss du natürlich das hier
Class_test1: TGUID = '{35F45D48-100C-4603-AA40-D10516B07704}'; noch anpassen und deine GUID eintragen, die auch in der Registry steht.

Als ich meinen USB Stick auf dem sich auch Bilder befinden hineinsteckte erscheint ja dieser Dialog. Dort habe ich auf meinen Eintrag geklickt und plötzlich stand in der ListBox jedenfalls das Laufwerk 'E:\', also der Laufwerksbuchstabe des Sticks. Meine bereits geöffnete Anwendung mit der Listbox wurde in dem Moment also benachrichtigt.

Zitat von EConvertError:
Ich hab erstmal herausgefunden, wie ich meine Anwendung registriere, damit ich in der Liste aufscheine.
Das würde mich übrigens auch interessieren wie du das gemacht hast.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#8

Re: "Datenträgerdialog" & Bilder von Datenträg

  Alt 2. Mai 2007, 11:24
Hmmm, danke!

Naja ganz das Wahre scheint deine Lösung nicht zu sein.

Immerhin berichtet der Threadstarter davon:
Zitat:
wenn mein Programm schon gestartet ist, ist alles Ok.
wenn es noch nicht gestartet war, öffnet es sich und am Ende von 'Drop' (kann man mit sleep() verzögern) wird das programm sofort wieder beendet
Das ist definitiv nicht das was wir wollen. Ich will erreichen, dass das Programm, wenn es noch nicht geöffnet ist, gestartet wird (und das auch bleibt).

Es scheint darauf hinauszulaufen, einen COM-Server zu schreiben (Automatisierungsobjekt), der IDropTarget implementiert.

Zitat:
Dort habe ich auf meinen Eintrag geklickt und plötzlich stand in der ListBox jedenfalls das Laufwerk 'E:\', also der Laufwerksbuchstabe des Sticks.
Wenn ich den MSDN-Artikel richtig verstanden habe, sollten wir direkt die Dateinamen erhalten (nicht nur Laufwerksbuchstaben):
Zitat:
If the application registered for IDropTarget, then all the files that were sniffed will be passed to the application through the IDataObject interface.
To extract the names of the files, query the data object for the clipboard format CFSTR_AUTOPLAY_SHELLIDLISTS defined in shlobj.h, or use TEXT("Autoplay Enumerated IDList Array") directly.
Für mich stellt sich also folgende Frage:
Wo implementiere ich IDropTarget? Schreibe ich eine Shellextension, oder baue ich das direkt in meine Anwendung ein? Ich würde zu letzterem tendieren, da ich dann das IDropTarget unter Umständen auch direkt für OLE-Drag & Drop verwenden kann (Näheres dazu wäre toll). Die Frage ist für mich: Wie kann man den OleServer da richtig implementieren. Denn ich würde dieses Interface gern extra in einem Objekt kapseln und nicht so "nebenbei" im TForm "mitimplementieren" (Vor allem, da das anscheinend wie im Zitat ersichtlich Nebenwirkungen hat.).

Wär gut, wenn sich da irgendein OLE/COM-Guru äußern könnte.

Hier macht man das mit einer ShellExtension, wobei allerdings das Drag & Drop nicht berücksichtigt wurde.

Zitat:
Das würde mich übrigens auch interessieren wie du das gemacht hast.
Ich verstehe die Frage nicht ganz. Du hast doch selbst ein Bild angehängt, wo du das schon erledigt hast.

Danke,
Andreas
Andreas N.
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#9

Re: "Datenträgerdialog" & Bilder von Datenträg

  Alt 2. Mai 2007, 19:30
Ich habe mich jetzt etwas über das IDragDrop-Interface informiert.

Normalerweise scheint das IDragDrop-Interface für OLE-Drag & Drop verwendet zu werden. Im Falle der Autoplay-Handler verwendet man anscheinend ebenfalls dieses Interface. Hoffentlich ist das selbe Interface gemeint, weil im Autostart-MSDN-Artikel steht, dass dieses Interface erst ab WinXP existiert. An anderer Stelle im MSDN wird so getan, als gäbe es das schon ewig.

Ich werde jetzt einmal versuchen mir so eine IDragDrop-Komponente zu bauen und dann mal sehen, ob das dann auch gleich funktioniert, oder ob es da noch einige Probleme gibt.

EDIT: Eine Sache ist mir noch unklar:
Zitat:
If the application registered for IDropTarget...
Alles schön und gut? Aber in welcher Form muss ich IDropTarget implementieren? Einfach eine Klasse in der .exe, die das IDropTarget implementiert, wird ja wohl kaum reichen, oder?


Wie lange das dauert, weiß ich noch nicht so genau, da man ja auch noch an seiner Matura basteln muss.

Für weitere Unterstützung bin ich weiterhin dankbar (Insbesondere, was meine vorigen Fragen betrifft).

Vielen Dank,
Andreas
Andreas N.
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: "Datenträgerdialog" & Bilder von Datenträg

  Alt 2. Mai 2007, 23:42
Zitat von EConvertError:
Ich will erreichen, dass das Programm, wenn es noch nicht geöffnet ist, gestartet wird (und das auch bleibt).
Moin Moin,

was ich noch fragen wollte startet nun bei dir das Programm (bei meinem Code 'C:\Project1.exe') wenn man auf den selbst erstellten Eintrag im Dialog klickt? Also bei mir wird das Programm gestartet.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:59 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