Frage von JaskiHax, 16

Windows Context Menu erweitern?

Hallo liebe Community,

ich habe aus Übungszwäcken einen Texteditor programmiert (C#) und möchte, dass wenn ich bei der Dateiendung ".BeispielTxt" und einem Rechtsklick darauf im Kontext Menü von Windows einen "Bearbeiten mit JaskiHaxEditor" habe. Wenn man auf diesen Button klickt soll mein Editor mit folgenden Parametern ausgeführt werden: 1.Der Pfad zur Datei. 2. "edit".

Wie kann ich sowas in C# programmieren?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Isendrak, 2

Das dürfte den gestellten Anforderungen entsprechen:

public static void RegisterFileType(string extensionName, string actionName, string commandValue, bool allUsers){
Microsoft.Win32.RegistryKey rootKey;
if(allUsers){
rootKey = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.ClassesRoot, Microsoft.Win32.RegistryView.Default);
}
else{
rootKey = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, Microsoft.Win32.RegistryView.Default);
}
Microsoft.Win32.RegistryKey extensionKey = rootKey.OpenSubKey((!allUsers?"classes\\":"")+extensionName);
if(extensionKey == null){
extensionKey = rootKey.CreateSubKey((!allUsers?"classes\\":"")+extensionName);
}
string defaultHandlerName = System.Convert.ToString(extensionKey.GetValue(""));
if(string.IsNullOrEmpty(defaultHandlerName)){
defaultHandlerName = "default" + extensionName;
}
Microsoft.Win32.RegistryKey defaultHandlerKey = rootKey.OpenSubKey((!allUsers?"classes\\":"")+defaultHandlerName);
if(defaultHandlerKey == null){
defaultHandlerKey = rootKey.CreateSubKey((!allUsers?"classes\\":"")+defaultHandlerName);
}
Microsoft.Win32.RegistryKey actionKey = defaultHandlerKey.OpenSubKey("shell\\"+actionName);
if(actionKey == null){
actionKey = defaultHandlerKey.CreateSubKey("shell\\"+actionName);
}
actionKey.SetValue("", actionName);
Microsoft.Win32.RegistryKey commandKey = actionKey.OpenSubKey("command");
if(commandKey == null){
commandKey = actionKey.CreateSubKey("command");
}
commandKey.SetValue("", commandValue);
commandKey.Close();
actionKey.Close();
defaultHandlerKey.Close();
extensionKey.Close();
rootKey.Close();
}

Verwendungsbeispiel:

RegisterFileType(".txt", "Bearbeiten mit JaskiHaxEditor", "C:\\WoAuchImmerSichdasProgrammBefindet\\JaskiHaxEditor.exe \"%1\" edit", true);

Zu den Parametern:

1. Die Dateinamenerweiterung inklusive Punkt

2. Die Bezeichnung des Kontextmenüeintrages

3. Der dem Kontextmenüeintrag zuzuordnende Befehl

4. Mit [true] wird der Eintrag für alle Benutzer erstellt (ggf. Administratorberechtigungen nötig), mit [false] nur für denjenigen, der das Programm gerade ausführt.

P.S.: Bei Bedarf, könnt ich die Funktion auch noch dahingehend erweitern, dass auf das Standardsymbol für den Dateityp angepasst werden kann.

Kommentar von JaskiHax ,

Vielen Dank dafür, bin sehr gespannt ob es funktionieren wird 👍✔😊

Antwort
von AnonYmus19941, 8

Das musst du gar nicht programmieren, das kannst du einfach in die Registry eintragen:

http://www.pqtuning.de/registry/windows-7/kontextmenue-anpassen-erweitern.html (hier die Parameter eintragen; Name sollte "%0" sein, evtl. geht es auch automatisch)

http://www.winfaq.de/faq_html/Content/tip1500/onlinefaq.php?h=tip1767.htm

Die beiden Seiten sollten reichen, ansonsten kannst du ja selbst noch ein bisschen suchen ...

Kommentar von JaskiHax ,

Vielen Dank, ich möchte das aber automatisch vom Programm machen lassen, da das andere ja auch tun und nicht jeder der sich das Programm runter laden würde das manuell in der Regestry macht. JaskiHax

Kommentar von AnonYmus19941 ,

Du kannst über die Kommandozeile einfach Registry-Einträge erstellen/verändern (http://www.computerhope.com/issues/ch000848.htm). Es gibt vermutlich auch eine Option, um Shell-Befehle oder ein Batch-Skript unter C# ausführen zu lassen.

Ansonsten: du willst also eine Art Installationsprogramm? Das erledigt man eigentlich auch nicht direkt, dafür gibt es andere Programme (z. B. NSIS; s. auch https://de.wikipedia.org/wiki/Installation\_%28Computer%29#Installationsprogramm...), die das erledigen.

Kommentar von JaskiHax ,

Okay danke. Ich schaue mal rein.

Sie kennen die Antwort?

Fragen Sie die Community