Hi,
wie kann ich am besten bei der Installation eine bestimmte Dateiendung mit meiner Anwendung verbinden? ALso das die Dateien beim Doppelklick mit meiner Anwendung geöffnet werden.
==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================
Sorry ich habe nicht richtig geschaut und gerade diese Klasse im Forum gefunden:
using Microsoft.Win32;
namespace Abc
{
/// <summary>
/// Klasse zum Erstellen und Löschen von Dateiassoziationen.
/// </summary>
public class FileAssociation
{
private FileAssociation() {}
/// <summary>
/// Erstellt eine neue Dateiassoziation. Alte Assoziazionen werden überschrieben.
/// </summary>
/// <param name="keyName">Name des Programmschlüßels</param>
/// <param name="applicationName">Name der Anwendung</param>
/// <param name="applicationPath">Pfad zur Executable der Anwendung</param>
/// <param name="extension">Dateierweiterung (ohne Punkt!)</param>
/// <param name="extensionIcon">Optionales Icon für die Dateierweiterung</param>
public static void CreateAssociation(string keyName, string applicationName, string applicationPath, string extension, string extensionIcon)
{
string keyValue = null;
RegistryKey key = null;
RegistryKey subKey = null;
keyValue = applicationName;
key = Registry.ClassesRoot.CreateSubKey(keyName);
key.SetValue("", applicationName);
if (extensionIcon != null)
{
subKey = key.CreateSubKey("DefaultIcon");
subKey.SetValue("", extensionIcon);
}
subKey = key.CreateSubKey("Shell");
subKey = subKey.CreateSubKey("Open");
subKey = subKey.CreateSubKey("command");
subKey.SetValue("", applicationPath + " \"%1\"");
subKey = Registry.ClassesRoot.CreateSubKey("." + extension);
subKey.SetValue("", keyName);
}
/// <summary>
/// Stellt fest, ob eine Dateiassoziation zur angegebenen Anwendung besteht.
/// </summary>
/// <param name="keyName">Name des Programmschlüßels</param>
/// <param name="applicationName">Name der Anwendung</param>
/// <param name="extension">Dateierweiterung (ohne Punkt!)</param>
/// <returns>True, wenn bereits eine Assoziation besteht</returns>
public static bool IsAssociated(string keyName, string applicationName, string extension)
{
try
{
RegistryKey key = Registry.ClassesRoot.OpenSubKey(keyName);
if ((string) key.GetValue("") == applicationName)
{
key.Close();
key = Registry.ClassesRoot.OpenSubKey("." + extension);
if ((string) key.GetValue("") == keyName)
{
return true;
}
}
return false;
}
catch
{
return false;
}
}
/// <summary>
/// Löscht eine Dateiassozaition. Achtung, es wird beim Löschen keine Rücksicht genommen, obs
/// sich um eine Assoziation zum eigenen Programm handelt!
/// </summary>
/// <param name="keyName">Name des Programmschlüßels</param>
/// <param name="extension">Dateierweiterung (ohne Punkt!)</param>
/// <returns>True, wenn der Löschvorgang erfolgreich war.</returns>
public static bool DeleteAssociation(string keyName, string extension)
{
try
{
Registry.ClassesRoot.DeleteSubKeyTree(keyName);
Registry.ClassesRoot.DeleteSubKeyTree("." + extension);
return true;
}
catch
{
return false;
}
}
}
}
[EDIT=herbivore]Damit sichergestellt ist, dass alle Änderungen im Windows-Explorer sofort wirksam werden, muss die Win32-Funktion SHNotifyChange SHChangeNotify aufgerufen werden.[/EDIT]
Aber dazu meine Frage:
Wo muss ich das einbauen? Passiert sowas normalerweise nicht während des Setups? Wenn ja wie?
==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================
Mach eine "User-Defined Aktion" und lasse dann diesen Code ablaufen. Wenn du mittels VS.NET 2003 des Setup erstellt kannst du eigene Programme hinzu fügen. Die einfachste Art ist du baust dir eine kleine Console Anwendung in welcher dein Code liegt. Dieser EXE führt dann dein Setup als Benutzerdefinierte Aktion aus und fertig ist deine Registrierung der Dateiendung.
Mit freundlichen Grüßen
René Paschold
.NET Developer / Trainer / Speaker / Author /
Projectleader / Software-Architect
.blog http://www.rene-paschold.de/
.business http://www.smarthouse.de/
Wie kann man eigene Programme einfügen?
==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================
Im Projektmappen-Explorer deines Setup Projektes findest du oben verschiedene Icons. Das fünfte von Links ist der Button für die benutzerdefinierten Aktionen. Wenn du das klickst, dann bekommst du im Hauptfenster einen TreeView der wie folgt aufgebaut ist:
Benutzerdefinierte Aktionen
Du machst einen Rechtsklick auf Installieren und fügst dort deine EXE ein. Die EXE wiederrum muss sich aber schon in deinem Setup befindet. Hinzufügen kannst du diese über den Dateisystem-Editor. Gehe dazu in den Projektmappen-Explorer und wähle das erste Icon von Links. Jetzt kannst du die Datei mit da rein packen.
Mit freundlichen Grüßen
René Paschold
.NET Developer / Trainer / Speaker / Author /
Projectleader / Software-Architect
.blog http://www.rene-paschold.de/
.business http://www.smarthouse.de/
Ich danke dir! 😁 👍
==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================
Hallo Maddinel,
Wo muss ich das einbauen? Passiert sowas normalerweise nicht während des Setups? Wenn ja wie?
naja, das ist so eine Sache. Wenn wir mal davon ausgehen, dass du die Extension .MaddinelSpecialFilesHjgfjkgfjk registrieren willst. Dann sollte es reichen, das in der Installationsroutine zu machen.
Aber oft geht es um Erweiterungen, die verbreitet sind (.bmp, .txt, ...) oder zumindest potentiell auch von anderen Anwendungen genutzt werden (könnten), z.B. .msf was MaddinelSpecialFile oder MicroSoftFormat oder - was wirklich verwendet wird - Mail Summary File (Mozilla Mail / ThunderBird) - heißen könnte.
Damit eine Anwendung weiterhin funktioniert (also ihre Dateiassoziation behält), wenn eine konkurrierende Anwendung die Assoziation umbiegt, prüfen viele Anwendungen die Assoziationen beim Start oder sogar ständig im Hintergrund (WinAmp) oder bieten solche Prüfung noch besser in den Optionen an.
Man sollte darauf achten, keine Kampfanwendungen zu schreiben, die sich gegenseitig (ständig) die Assoziationen wegziehen, sondern den Benutzer im Vorfeld fragen und ihm auch später genaue Eingriffsmöglichkeiten geben (Optionen).
HTH
herbivore
s. dazu auch die Klassen von www.Mentalis.org
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
Tut mir leid, dass ich ein so altes Thema ausgrabe, aber ich habe eine Frage dazu.
Herbivore schrieb:
Damit sichergestellt ist, dass alle Änderungen im Windows-Explorer sofort wirksam werden, muss die Win32-Funktion SHNotifyChange aufgerufen werden.
Jedoch habe ich gesucht, leider aber nicht gefunden wie ich die Funktion aufrufen kann. Es wäre sehr nett , wenn mir jemand erklären könnte, wie ich das am besten anstelle.
Mfg wizer
Hallo wizer,
Jedoch habe ich gesucht, leider aber nicht gefunden wie ich die Funktion aufrufen kann
Korrekterweise heißt die Funktion SHChangeNotify - dazu müsste sich dann auch einiges finden lassen.
Bei WinAPI-Funktionen am besten immer direkt bei pinvoke.net vorbeischauen: http://pinvoke.net/default.aspx/shell32/SHChangeNotify.html
Hallo,
ich versuche gerade dasselbe umzusetzen. Meine (Anfänger)Frage ist, woher weiß ich den Programmschlüsssel. Ist das der, der in der Registry für die .exe eingetragen ist? Woher weiß ich, welchen das Setup dort einträgt?
Gibt es eine einfache Möglichkeiten das ganze im Debugging zu testen, ohne dass das Programm installiert ist?
Dankeschön!
Gruß
Andre
Hallo AKNOT,
die Sache läuft zweistufig. In der Registry steht zu der Dateiendung (also z.B. .mde) der Dateityp (also z.B. MeineDateiEndung). Und erst bei der stehen dann die möglichen Aktionen und welches Programm dafür ausgeführt werden muss. Von der Dateiendung ausgehend, bekommst du also alle Informationen, die du braucht. Du kriegst so auch heraus, was das Setup eingetragen hast. Debuggen braucht man da eigentlich nichts. Das läuft ja zuverlässig. Wenn du ausprobieren willst, ob dein Programm auch wirklich (so) aufgerufen wird, wie du es willst, muss es aber schon installiert sein.
herbivore
PS: Für die Kommandozeile gibt es die Befehle assoc und ftype.