![]() |
[Registry] Windows Explorer Kontextmenü: Für alle Dateien
Hallo,
ich habe ein kleines Programm geschrieben, welches als Parameter einen Dateinamen erwartet... Ich würde das Programm jetzt gerne für eine (beliebige) Datei (und später auch für mehrere Dateien oder komplette Verzeichnisse) aus dem Kontextmenü des Explorers aufrufen. Aber genau hier komme ich nicht weiter. Für einen bekannten Dateityp ist das Einfügen eines Eintrages in das Kontextmenü ja nicht wirklich schwer (zumindest jetzt nicht mehr)... Aber das ganze "global", also unabhängig von der Dateierweiterung einzufügen stellt mich vor eine zur Zeit unüberwindbare Hürde. Hab mich auch schon ein bisschen mit google "unterhalten" (Stichwort: contextmenuhandlers), da war auch einiges zu finden, aber leider nichts, was mich weiter gebracht oder mir das System eines solchen Eintrages erklärt hätte. Hat jemand vielleicht ne Idee, wo ich mich schlau machen kann? |
Re: [Registry] Windows Explorer Kontextmenü: Für alle Dateie
Hallo Dunedain,
ich habe mal spontan in der Reg nachgesehen, da ich WinRAR installiert hab, welches genau so einen Eintrag in den Kontextmenüs erzeugt. So wie ich das sehe besteht der Trick lediglich darin als Dateityp bzw. Endung "*" zu verwenden. Ich hoffe das bringt dich weiter. Gruß Mr_G |
Re: [Registry] Windows Explorer Kontextmenü: Für alle Dateie
Liste der Anhänge anzeigen (Anzahl: 1)
Servus und frohes neues Jahr.
Hab das auch schon mal vor langer Zeit gemacht. Hier die Funktion um ne Erweiterung zu registrieren:
Delphi-Quellcode:
Und hier die zum löschen:
// app muss den kompletten Dateipfad + Dateiname des Programms beinhalten
// fileext soll die Erweiterung sein (ohne Punkt) // caption ist der Text der angezeigt werden soll function RegConMenu(app, fileext, caption: String): Boolean; var reg: TRegistry; begin result := false; reg := TRegistry.Create; try reg.RootKey := HKEY_CLASSES_ROOT; // Zum Schlüssel des angegebenen Dateitypen springen, // falls nicht vorhanden wird dieser erstellt if reg.OpenKey('.' + fileext + '\Shell\' + caption + '\command', true) then begin //Anwendung eintragen, %1 übergibt den Dateinamen reg.WriteString('', '"' + app + '" -mount 0,"%1"'); reg.CloseKey; result := true; end; finally FreeAndNil(reg); end; end;
Delphi-Quellcode:
Im Anhang befindet sich ein Screeny vom Schlüssel. Wie Mr_G richtig gesagt hat, für alle Dateien ist der Schlüssel "*".
// fileext ist die Erweiterung (ohne Punkt)
// caption ist der Text des Menüpunkts // wird delfiletype mit true beantwortet wird die gesamte Dateierweiterung aus der // registry gelöscht, mit false nur der Kontextmenüeintrag function DelConMenu(fileext, caption: String; delfiletype: Boolean): Boolean; var reg: TRegistry; begin result := false; reg := TRegistry.Create; try reg.RootKey := HKEY_CLASSES_ROOT; if delfiletype then begin //Schlüssel löschen if reg.KeyExists('.' + fileext) then reg.DeleteKey('.' + fileext); end else begin //Zum Schlüssel des angegebenen Dateitypen springen if reg.OpenKey('.' + fileext + '\Shell\', false) then begin //Schlüssel löschen reg.DeleteKey(caption); reg.CloseKey; result := true; end; end; finally FreeAndNil(reg); end; end; PS: Für Schäden an der Registry übernehme ich keine Haftung. |
Re: [Registry] Windows Explorer Kontextmenü: Für alle Dateie
Danke für die schnellen Antworten.
In gewisser Hinsicht habt Ihr beide Recht. @ Mr_G Der * war auch mein erster Anlaufpunkt. Hab natürlich auch versucht, bestehende Einträge zurück zuverfolgen (WinRar, 7-Zip, ...). Aber leider bin ich zu keinen Ergebnis gekommen, außer das "es" etwas mit der CLSID zu tun haben muss (welche vermutlich das Ziel des Aufrufes vom Kontextmenü darstellt?) was mich nicht weiter bringt, da der *-Schlüssel anders aufgebaut ist, wie die Schlüssel, die auf eine feste Dateierweiterung verweisen. @ TwoFace: Code funktioniert, aber leider nur, wenn ich eine bestimmte Dateierweiterung registrieren will. (Habs zwar selbst ein bischen anders gemacht, Ergebnis ist aber gleich) |
Re: [Registry] Windows Explorer Kontextmenü: Für alle Dateie
Sorry... sowas hatte ich befürchtet.
Ich hab gerade einfach nochmal die Suche angeschmissen und es scheint so zu sein wie du bereits gesagt hast: Man verweist mit der CLSID auf eine Extension, die man in einer DLL zur Verfügung stellt (wenn ich das beim überfliegen richtig verstanden habe). Lange rede kurzer Sinn: Lies dir ![]() Gruß Mr_G |
Re: [Registry] Windows Explorer Kontextmenü: Für alle Dateie
Das sieht schonmal sehr vielversprechend aus...
Auch wenn mir der Umweg über eine DLL gar nicht gefallen will... Werde aber erst morgen dazu kommen, daran mal ein bischen rumzubasteln. Vielleicht kann mir jemand "in der Zeit" die Delphi Demo packen und hochladen? Verwende kein Delphi, sondern BCB, aber Delphi Code lässt sich auch dort verwenden... :) |
Re: [Registry] Windows Explorer Kontextmenü: Für alle Dateie
wie in den Beiträgen zu lesen ist musst du nicht über eine DLL gehen sondern kannst auch wie bei allen anderen Endungen den Command-Schlüssel verwenden.
|
Re: [Registry] Windows Explorer Kontextmenü: Für alle Dateie
Danke, es geht, akà
\*\shell\[Name]\command\@[AppName] Aber wie kann ich zusätzlich Icons vor den Kontextmenüeinträgen anzeigen? Eine Kaskadierung (Untermenü) wäre auch schön... :???: (Ist bloß die Frage, ob das bei lediglich 2 Untermenüpunkten [Verschlüsseln|"Sicher" löschen] sinnvoll ist??? Was meint Ihr?) Jaja, ich weiß: Warum einfach, wenns auch schwierig geht? Jemand ne Idee? |
Re: [Registry] Windows Explorer Kontextmenü: Für alle Dateie
Liste der Anhänge anzeigen (Anzahl: 1)
Servus
also wie das mit Untermenüs geht weiß ich leider auch nicht. Hab nur rausgefunden, wie das wahrscheinlich mit den Icons funktioniert. Als Beispiel WinRAR. Der Schlüssel
Code:
verweist auf deinen Schlüssel:
HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WinRAR
Bei mir:
Code:
Wenn ich nach diesem Schlüssel suche, komm ich zu einem bei dem als Default-Wert "WinRAR" steht. Scroll ich nun weiter runter, bis ich bei WinRAR bin und diesen Schlüssel öffne, schaut das bei mir so aus, wie auf dem Bild im Anhang.
{B41DB860-8EE4-11D2-9906-E49FADC173CA}
Beim Schlüssel "Defaulticon" steht als Wert "C:\Programme\WinRAR\WinRAR.exe,0" (ohne Anführungszeichen), welcher sich aus <<Pfad zur Anwendung>>,<<Index des Icons>> zusammensetzt. Habs zwar noch nicht gecheckt, aber es erscheint mir sehr einleuchtend. :-) ;-) Greetz TwoFace |
Re: [Registry] Windows Explorer Kontextmenü: Für alle Dateie
Moin,
ich hab bei meinem letzten Programm auch so nen Eintrag fürs Explorer Kontextmenü gebraucht und habs mit einer DLL gemacht. Ist eigentlich garnet so kompliziert wies am Anfang aussieht. Dieses Beispiel ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz