Programm per Doppelklick auf Datei öffnen

Tikonteroga

Erfahrenes Mitglied
Hallo,

ich möchte eine Anwendung mit Windows Forms entwickeln, die folgende Funktionen unterstützt.

1. Wenn ich eine Datei mit einem bestimmten Suffix im Explorer doppelt anklicke, soll eine Instanz meiner Anwendung gestartet und die Datei geöffnet werden, als hätte ich sie über die Menüleiste Datei -> Öffnen geöffnet.

2. Wenn meine Anwendung gestartet und bereits eine Datei geöffnet ist und ich über Datei -> Öffnen oder Datei -> Neu eine neue Datei erstelle oder öffne soll eine neue Instanz meiner Anwendung gestartet werden in der die Datei geöffnet bzw. die neue Datei erstellt wird.

Jetzt zu meinen Fragen.

1. Wie und wo sollte ich den Pfad der Datei abfragen, die per Doppelklick mit der Anwendung geöffnet werden soll?

2. Wie kann ich aus einer Anwendung heraus eine weitere Instanz der Anwendung mit einem Pfad als Argument aufrufen?
 
Hallo Tikonteroga,

Dass deine Applikation gestartet wird wenn du auf einen bestimmten Dateityp klickst funktioniert mit Shell Extensions. Allerdings sei hier gesagt, dass Microsoft abrät Shellextensions mit .NET zu entwickeln.

Du trägst in der Registry bei der Dateiendung (Unter HKCU oder HKLM bei Software\Classes\) die Schlüssel Shell\Open\Command ein und setzt dessen Standardwert auf den Befehl der aufgerufen werden soll.

Ein Beispiel:
regShell.jpg

Du siehst auch gleich das %1 im Command. Das ist der Dateipfad und er wird in diesem Fall als Kommandozeile an notepad (oder eben dein Programm) übergeben und kann da ausgelesen werden.

Eine neue Instanz deines Programms startest du in dem du einen entsprechenden Prozess erstellst. Diesem kannst du dann auch als Kommandozeile den Pfad der Datei übergeben den er bearbeiten sollte.

Grüsse
Cromon
 
Hallo Shakie,

Zitat von Jesse Kaplan, CLR Program Manager
Unfortunately unmanaged C++ is really the only way to go here.

Writing in-process shell extensions in managed code is actually a very dangerous thing to do because it has the effect of injecting your managed code (and the .NET Framework) into every application on the machine that has a file open dialog.

The problems occur because only one version of the .NET Framework can be loaded in a process at any given time (other shared components such as java and msxml have the same property and thus the same restriction).

If you write your shell extension using the 2.0 .NET Framework and an application built with the 1.1 .NET Framework uses a file open dialog, your shell extension will fail because it can not run on an earlier version. Things can get even worse if your shell-extension manages to get loaded in a process before another applications managed code does: your extension may force an existing application onto a different runtime version than the one it was expecting and cause it to fail.

Because of these problems we strongly recomend against using any single-instance-per-process runtime or library (such as the .NET Framework, java, or msxml) in an in-process shell extension.

Grüsse
Cromon
 
1. Wenn ich eine Datei mit einem bestimmten Suffix im Explorer doppelt anklicke, soll eine Instanz meiner Anwendung gestartet und die Datei geöffnet werden, als hätte ich sie über die Menüleiste Datei -> Öffnen geöffnet.
Ist das bereits eine Shell-Extension? Ich dachte, von Shell-Extensions spricht man, sobald die Extension Eigenschaften der Datei analysiert - also zum Beispiel ein zusätzliches Kontextmenü bei einem Rechtsklick auf die Datei anbietet (z.b. "Play in Media Player").

Jedenfalls habe ich mal gesucht und es sieht so aus, als wäre das von Jesse Kaplan beschriebene Problem mit .Net 4 behoben: please note that you still cannot write shell extensions using any version earlier than .NET Framework 4 .
 
Die neue Instanz startest Du so:
Code:
private void NewInstance(string FilePath)
{
       ProcessStartInfo startInfo = new ProcessStartInfo();
       startInfo.UseShellExecute = true;
       startInfo.WorkingDirectory = Environment.CurrentDirectory;
       startInfo.FileName = Assembly.GetExecutingAssembly().Location;
       startInfo.Arguments = "-File=" + FilePath;
}

Jetzt musst du nur noch das Argument beim Programmstart auslesen!
Ich weiß ja nicht wie du das grade machst?!
Musst evtl. noch den Argumentennamen anpassen oder so.
Liebe Grüße
Felix :)
 

Neue Beiträge

Zurück