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 Kontextmenü des Explorere ergänzen (https://www.delphipraxis.net/22725-kontextmenue-des-explorere-ergaenzen.html)

Luckie 22. Mai 2004 10:44


Kontextmenü des Explorere ergänzen
 
Hallo.

Ich wollte das Kontextmenü des Explorers mit einem eigenen Eintrag erweitern. Und wenn man diesen anklickt, soll sich mein Programm öffnen und was mit der ausgewählten Datei machen.

Ich habe schon die Forensuche bemüt [dp]explorer menü[/dp], aber irgendwie hatten wir das wohl noch nicht. :gruebel:

Ja, meine Frage, wie muss ich da jetzt vorgehen?

Sharky 22. Mai 2004 10:47

Re: Kontextmenü des Explorere ergänzen
 
Hai Luckie,

hilft Dir der Beitrag weiter?

Luckie 22. Mai 2004 10:51

Re: Kontextmenü des Explorere ergänzen
 
Hmpf, warum finde ich so was nicht? Werde es mir mal ankucken.

SirThornberry 22. Mai 2004 10:52

Re: Kontextmenü des Explorere ergänzen
 
also winzip hat dafür (zumindest früher als ichs noch hatte) einen hook laufen gehabt und das Menü dann dynamich ergänzt. Als ich den hook gekickt hab waren dann auch dei Contexteinträge von winzip weg... ICQ scheints ebenso zu machen. Als ich icq eben beendet hab waren auch die contextmenüs weg. Es gibt maximal noch in der Registry einen Ort, allerdings wird dann der Contexteintrag bei allen Ordnern, incl. Papierkorb und so angezeigt

[Edit]Zu langsam, werd wohl langsam alt...[/Edit]

Luckie 22. Mai 2004 11:01

Re: Kontextmenü des Explorere ergänzen
 
Ich habe mir mal die Delphi Demos angekuckt. Das sind ja anscheinend drei unterschiedliche. Welches wäre denn das für mich relevante? Ich stehe da etwas auf dem Schlauch, da ich so was noch nie gemacht habe.

MathiasSimmack 22. Mai 2004 11:14

Re: Kontextmenü des Explorere ergänzen
 
1. Wenn es nur darum geht, ein Programm zu starten, dann reicht es IMHO aus, wenn du den Dateityp in der Registry entsprechend ergänzt. Als Beispiel: Ich habe für die Dateitypen XML/XSL/XSD/DTD ein VBSkript geschrieben, das Proton als Editor einträgt.

2. In Sonderfällen nimmst du eine Shell-Extension, wobei mir aber jetzt kein Sonderfall einfällt. :( Ich habe 3 Shell-Extensions, um bspw. Verknüpfungen im Startmenü oder auf dem Desktop anlegen zu lassen, indem ich im Explorer einfach die gewünschte Datei anklicke. Die dritte Shell-Extension kann das Ziel von Verknüpfungen kopieren. Sprich: Du klickst eine LNK-Datei an, wählst "Ziel kopieren" und dann "Einfügen", und es wird die Datei in den Ordner kopiert, auf die die LNK-Datei verweist.

Luckie 22. Mai 2004 11:18

Re: Kontextmenü des Explorere ergänzen
 
Zu ersterem. Das geht nicht. Wenn ich den dateityp anklicke, soll schon noch das standard Programm geöffnet werden. In diesem Fall ein geht es um JPEGs. Digital Kameras speichern noch zusätzlich Infos in der Datei. Klicke ich jetzt eine JPEG Datei doppelt an, soll schon noch das Bildbetrachtungsprogramm aufgehen und nicht mein Programm welches die zusätzlichen Infos anzeigt.
Das heißt es wird wohl doch auf eine Shell-Extension hinauslaufen.

MathiasSimmack 22. Mai 2004 11:30

Re: Kontextmenü des Explorere ergänzen
 
Du hast wahrscheinlich vergessen, dass es mehr als eine Zuordnung geben kann. Nimm als Beispiel den NSIS-Dateityp ".nsi". Standardmäßig trägt das Setup bei der Installation Notepad als Editor ein. Ich habe mir aber selbst den Eintrag für Proton ergänzt. Das heißt, wenn ich will, dann kann ich Notepad benutzen (Rechtsklick auf die ".nsi"-Datei -> Öffnen), oder ich nehme Proton (Doppelklick, bzw. Rechtsklick -> Bearbeiten mit Proton).

MathiasSimmack 22. Mai 2004 11:33

Re: Kontextmenü des Explorere ergänzen
 
PS:

Zitat:

Zitat von Luckie
[...] und nicht mein Programm welches die zusätzlichen Infos anzeigt.

Was hältst du in dem Fall von einer Property-Page, die sich in die Datei-Eigenschaften einklinkt? Ähnlich den Datei-Infos unter 2000/XP. Du registrierst die Seite für den gewünschten Typ, und wenn du dir dann die Eigenschaften anzeigen lässt (Rechtsklick auf JPG-Datei -> Eigenschaften) siehst du eine zusätzliche neue Seite mit den Infos zum Bild, die dann aus deinem Programm kommt - bzw. deiner DLL in dem Fall, denn es ist ja auch nur eine Abart der Shell-Extension.

Luckie 22. Mai 2004 11:42

Re: Kontextmenü des Explorere ergänzen
 
Das wäre natürlich auch eine Möglichkeit. Jetzt probiere ich es erstmal so mit einer Shell-Erweiterung. Und dann noch mal mit einer Property-Page.

Luckie 22. Mai 2004 13:07

Re: Kontextmenü des Explorere ergänzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wo ist hier der Denkfehler:
Delphi-Quellcode:
{*------------------------------------------------------------------------------
  Explorer-Kontextmenü erweitern
-------------------------------------------------------------------------------}

function TExifReaderExt.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
  idCmdLast, uflags: UINT): HResult;
resourcestring
  rsExifReader = 'ExifReader';
begin
  if ((uFlags and $0000000F) = CMF_NORMAL) or ((uFlags and CMF_EXPLORE) <> 0)
    then
  begin
    InsertMenu(Menu, indexMenu, MF_STRING or MF_BYPOSITION, idCmdFirst,
      PChar(rsExifReader));
    Result := 1;
  end
  else
    Result := 0;
end;
Das Registrieren funktioniert wunderbar, nur bekomme ich keinen Menüpunkt zu sehen.

Falls es nötig ist, hab eich mal die ganze Unit angehangen.

MathiasSimmack 22. Mai 2004 13:23

Re: Kontextmenü des Explorere ergänzen
 
Hast du mal probiert, das nicht unter ".jpg" sondern dem dazu gehörenden Schlüssel (bei mir "jpegfile") einzutragen? So habe ich´s bei meiner Shell-Extension für LNK-Dateien gemacht. Kann auch sein, dass es nicht daran liegt, denn so ausführlich habe ich mich damit auch noch nicht beschäftigt.

Aber ich glaube immer noch, dass du zu kompliziert denkst. Greif dir den Standardschlüssel des ".jpg"-Eintrags und ergänze dort unter "shell" den Eintrag für dein Programm. Das müsste normalerweise reichen.

Luckie 22. Mai 2004 13:32

Re: Kontextmenü des Explorere ergänzen
 
Zitat:

Zitat von MathiasSimmack
Hast du mal probiert, das nicht unter ".jpg" sondern dem dazu gehörenden Schlüssel (bei mir "jpegfile") einzutragen?

Gerade probiert, geht auch nicht.
Zitat:

Aber ich glaube immer noch, dass du zu kompliziert denkst. Greif dir den Standardschlüssel des ".jpg"-Eintrags und ergänze dort unter "shell" den Eintrag für dein Programm. Das müsste normalerweise reichen.
Das will ich ja machen, siehe Source:
Delphi-Quellcode:
procedure TExifReaderExtFactory.UpdateRegistry(Register: Boolean);
var
  ClassID: string;
begin
  if Register then
  begin
    inherited UpdateRegistry(Register);
    ClassID := GUIDToString(GUID_EXIFREADEREXT);
    CreateRegKey('.jpg\shellext', '', '');
    CreateRegKey('.jpg\shellext\ContextMenuHandlers', '', '');
    CreateRegKey('.jpg\shellext\ContextMenuHandlers\ExifReaderExt', '',
      ClassID);
  end
  else
  begin
    DeleteRegKey('.jpg\shellext');
    DeleteRegKey('.jpg\shellext\ContextMenuHandlers');
    DeleteRegKey('.jpg\shellext\ContextMenuHandlers\ExifReaderExt');
    inherited UpdateRegistry(Register);
  end;
end;

sakura 22. Mai 2004 13:34

Re: Kontextmenü des Explorere ergänzen
 
Ändere ShellExt mal in ShellEx ;)

...:cat:...

MathiasSimmack 22. Mai 2004 13:52

Re: Kontextmenü des Explorere ergänzen
 
Zitat:

Zitat von Luckie
Das will ich ja machen, siehe Source

Ja, schon. Aber das ist doch zu umständlich. Ich meinte das anders -

Wenn du deinen selbst geschriebenen Texteditor als zusätzlichen Editor für Textdateien registrieren willst, dann baust du doch dafür auch keine Shell-Extension zusammen. Na ja, ich kann nur für mich sprechen ... ;) ... Also ich würde die Registry öffnen und den Standardwert von ".txt" auslesen.
Das wäre bei mir "txtfile". Diesen Schlüssel öffne ich und ergänze dann unter "shell" die notwendigen Einträge für meinen Editor. So wie man das auch macht, wenn man seinen eigenen Dateityp registriert. Nur dass ich eben nicht "open" überschreibe, sondern meinen eigenen Schlüssel für meinen eigenen Editor anlege. Dadurch kann ich Textdateien nach wie vor mit Notepad öffnen, ich kann aber auch meinen Editor nehmen.

Das habe ich gemeint.

Und mal ehrlich: In deiner Shell-Extension passiert auch nichts weiter. Du rufst bloß "ShellExecute" zum Starten des Programms auf. Sorry (meine Meinung), aber da hättest du dir den Aufwand sparen können. :stupid:

MathiasSimmack 22. Mai 2004 14:00

Re: Kontextmenü des Explorere ergänzen
 
Ui, und das hier:
Zitat:

Zitat von Luckie
Delphi-Quellcode:
    DeleteRegKey('.jpg\shellext');
    DeleteRegKey('.jpg\shellext\ContextMenuHandlers');

scheint mir auch ziemlich gefährlich. Wenn sich noch ein Programm als Erweiterung für JPEGs einträgt, sind die damit IMHO auch fort. :shock:

Luckie 22. Mai 2004 14:01

Re: Kontextmenü des Explorere ergänzen
 
Also wenn du soll willst könnte ich mein Programm auch in das "Senden an"-Menü packen. Ich wollte es aber mal über das Kontextmenü probieren.

MathiasSimmack 22. Mai 2004 14:04

Re: Kontextmenü des Explorere ergänzen
 
Liegt das irgendwie an mir: :cry:
Habe ich dir was getan?
Mag mich keiner mehr?

:mrgreen:


Wenn du es mit dem von mir genannten Prinzip der Dateiendung machst, dann steckt es doch im Kontextmenü. Was denn noch? Sorry, aber ich muss mal diesen hier machen: :wall:

:zwinker:

Luckie 22. Mai 2004 14:09

Re: Kontextmenü des Explorere ergänzen
 
Ich stehe irgendwie auf dem Schlauch.

Was soll ich in der Registry eintragen? Ginge das dann auch mit einer inf-Datei? Und wenn ja. Wie müsste diese aussehen?

MathiasSimmack 22. Mai 2004 14:15

Re: Kontextmenü des Explorere ergänzen
 
Ich habe schon befürchtet, dass ich mit dir in Quellcode sprechen muss, damit du mich verstehst. :mrgreen: Hier mal das Beispiel für Textdateien.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  reg : TRegistry;
  s  : string;
begin
  reg := TRegistry.Create;
  if(reg <> nil) then
  try
    reg.RootKey := HKEY_CLASSES_ROOT;
    s          := '';

    // womit ist der Typ ".txt" verknüpft?
    if(reg.OpenKey('.txt',false)) then
    try
      s := reg.ReadString('');
    finally
      reg.CloseKey;
    end;

    // so, gibt´s da was?
    if(s <> '') and
      (reg.KeyExists(s)) and
    // dann öffnen, ...
      (reg.OpenKey(s + '\shell\ProtonEdit\command',true)) then
    try
    // ... & Proton ergänzen
      reg.WriteString('','"c:\programme\powertoy\proton.exe" "%1"');
    finally
      reg.CloseKey;
    end;
  finally
    reg.Free;
  end;
end;
Würdest du jetzt das Kontextmenü einer Textdatei aufrufen, dann siehst du nach wie vor die Einträge "Öffnen", "Drucken", usw. Aber ebenfalls dabei ist jetzt auch "ProtonEdit". Ist zwar kein schöner Begriff für´s Menü, aber es geht ja nur um die Idee.

Schönen Gruß an deine Freundin. Die soll dich nicht so hart ... äh ... ran nehmen ... ;)

Corelgott 22. Mai 2004 14:24

Re: Kontextmenü des Explorere ergänzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi @ all,

sagt mal leute macht ihr euch das hier nicht alle ein wenig schwer??
Extra mit ner shell Extension an kommen?
Geht bestimmt auch aber irgendwie ist das doch so, als wenn man mit spatzen auf kanonen schießt... :gruebel:

also ich dachte immer eigene einträge in ein Kontextmenü vom Exploer hinzufügen ginge so...

Hier mal der inhalt einer Reg-Datei

[regFile]
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\jpegfile\shell\Extra\command]
@="Programmpfad \"%1\""
[/regFile]

Da wo Extra steht kommt die Caption des Menü-Punkts rein;
Bei Programmpfad darf jeder mal raten :zwinker:
Und danach wo \"%1\" kommt nachher der Pfad der angewählen Datei rein...

Also bei mir gings so....

siehe Screen-Shot...

cya
Corelgott

Luckie 22. Mai 2004 15:46

Re: Kontextmenü des Explorere ergänzen
 
Spitze. Schwarze Schrift auf dunkelgrauen Hintergrund. Wie kannst du damit arbeiten? :roll:

So, habe es hjetzt geschaft. Stelle es gleich in der Opensource-Sparte vor.

Corelgott 22. Mai 2004 15:57

Re: Kontextmenü des Explorere ergänzen
 
Freut mich, dass ich helfen konnte....

Zitat:

Zitat von Luckie
Spitze. Schwarze Schrift auf dunkelgrauen Hintergrund.

Wo ist das porblem? 8)
Mein Fensterhintergrund ist dazu noch hell grau statt weis...
Wird man wenigstens nicht so extrem geblendet, wenn man nachts vorm pc sitzt !!! :cyclops:

cya Corelgott

Luckie 22. Mai 2004 16:01

Re: Kontextmenü des Explorere ergänzen
 
Zitat:

Zitat von Corelgott
Freut mich, dass ich helfen konnte....

Äh, nein, ich habe es so gemacht, wie ich es auch ursprünglich wollte. ;)

MathiasSimmack 22. Mai 2004 17:08

Re: Kontextmenü des Explorere ergänzen
 
Zitat:

Zitat von Corelgott
sagt mal leute macht ihr euch das hier nicht alle ein wenig schwer??

Nein?

Zitat:

Extra mit ner shell Extension an kommen?
Ja, das war in dem Fall vielleicht etwas übertrieben.

Zitat:

Geht bestimmt auch aber irgendwie ist das doch so, als wenn man mit spatzen auf kanonen schießt... :gruebel:
Das kommt auf die Situation an, sage ich einfach mal.

Zitat:

also ich dachte immer eigene einträge in ein Kontextmenü vom Exploer hinzufügen ginge so...

Hier mal der inhalt einer Reg-Datei
Da wäre natürlich auch eine INF-Datei möglich, aber wer garantiert, dass
Zitat:

Code:
[HKEY_CLASSES_ROOT\[color=red]jpegfile[/color]\shell\[b]Extra[/b]\command]

immer und in jedem Fall der Schlüssel für JPEGs ist? Es ist ja durchaus denkbar, dass jemand Programm benutzt, dass die Endung ".jpg" auf einen eigenen Schlüssel umleitet und den alten Schlüssel (der dann durchaus "jpegfile" heißen kann aber nicht muss!) für die Deinstallation intakt lässt. In dem Fall würde sich deine REG-Datei in den alten Schlüssel schreiben, und du würdest keinen neuen Menüpunkt sehen.

Darum halte ich persönlich den o.g. Weg für besser, bei dem herausgefunden wird, auf welchen Schlüssel ein Dateityp verweist.

dopeline 7. Aug 2004 11:51

Re: Kontextmenü des Explorere ergänzen
 
Hallo!

Ich habe den Code von MathiasSimmack (s.o.) benutzt und wollte fragen, wie ich diesen Eintrag im Kontextmenü wieder entfernen kann?

Gruß, dopeline

MathiasSimmack 7. Aug 2004 12:52

Re: Kontextmenü des Explorere ergänzen
 
Ein viel besserer Gegenvorschlag: TFileTypeRegistration@Delphi-Forum.
Diskussionen, Kritik, (Verbesserungs)Vorschläge sind immer erwünscht.


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