c # Datei mit Standardanwendung und Standardparametern öffnen

103

Der einfachste Weg, eine Datei mit der Standardanwendung zu öffnen, ist:

System.Diagnostics.Process.Start(@"c:\myPDF.pdf");

Ich möchte jedoch wissen, ob es eine Möglichkeit gibt, Parameter für die Standardanwendung festzulegen, da ich ein PDF in einer bestimmten Seitenzahl öffnen möchte.

Ich weiß, wie man einen neuen Prozess erstellt und die Parameter einstellt, aber auf diese Weise muss ich den Pfad der Anwendung angeben, und ich möchte eine tragbare Anwendung haben und nicht jedes Mal den Pfad der Anwendung festlegen müssen Ich benutze die Anwendung in einem anderen Computer. Meine Idee ist, dass ich erwarte, dass der Computer den PDF-Reader installiert hat und nur sage, was die Seite öffnen soll.

Vielen Dank.

Álvaro García
quelle
Meinen Sie damit, Parameter an die ausführbare Adobe-Datei und nicht an die PDF-Datei zu senden, ohne jedoch den vollständigen Pfad zu verwenden?
Bali C
2
Wie soll das funktionieren? Wenn Sie den Pfad der Anwendung nicht kennen, wissen Sie nicht, welcher der Standard-PDF-Viewer ist, und Sie wissen nicht, welches Parameterformat verwendet werden soll.
Ken2k
2
Ist es nicht genug zu sagen, myProcess.StartInfo.FileName = "Acrobat.exe";ohne den vollständigen Pfad zur Anwendung anzugeben?
Daniloquio
1
Schauen Sie sich diese SO-Frage an, um zu sehen, dass sie hilft
Mark Hall
2
@daniloquio: Ich denke, der Punkt ist, dass das OP nicht weiß, was der Endbenutzer auf seinem Computer installiert hat, um Adobe-Dateien zu lesen. Dies kann Acrobat, Acrobat Reader oder etwas anderes sein.
Surfbutler

Antworten:

43

Wenn Sie möchten, dass die Datei mit der Standardanwendung geöffnet wird, können Sie die Datei ohne Angabe von Acrobat oder Reader nicht auf der angegebenen Seite öffnen.

Wenn Sie mit der Angabe von Acrobat oder Reader einverstanden sind, lesen Sie weiter:


Sie können dies tun, ohne den vollständigen Acrobat-Pfad wie folgt anzugeben:

Process myProcess = new Process();    
myProcess.StartInfo.FileName = "acroRd32.exe"; //not the full application path
myProcess.StartInfo.Arguments = "/A \"page=2=OpenActions\" C:\\example.pdf";
myProcess.Start();

Wenn Sie nicht möchten, dass das PDF mit Reader, sondern mit Acrobat geöffnet wird, ändern Sie die zweite Zeile wie folgt:

myProcess.StartInfo.FileName = "Acrobat.exe";

Sie können die Registrierung abfragen, um die Standardanwendung zum Öffnen von PDF-Dateien zu identifizieren, und dann den Dateinamen in StartInfo Ihres Prozesses entsprechend definieren.

Befolgen Sie diese Frage, um Einzelheiten dazu zu erfahren: Suchen der Standardanwendung zum Öffnen eines bestimmten Dateityps unter Windows

daniloquio
quelle
2
+1 Ich denke auch, dass es möglich ist, die mit jedem Dateityp verknüpfte Anwendung, z. B. '.pdf', in der Registrierung nachzuschlagen und diesen Namen dann in den Dateinamenparameter einzufügen. Siehe stackoverflow.com/questions/162331/…
Surfbutler
Gibt es einen offenen Parameter, mit dem Adobe Reader in einer 2-Seiten-Ansicht geöffnet werden kann? Nur neugierig, wenn jemand weiß, wäre das wirklich nützlich. Ich habe mich umgesehen, aber ich kann nichts finden.
Taki Martillo
18

das sollte nah sein!

public static void OpenWithDefaultProgram(string path)
{
    Process fileopener = new Process();
    fileopener.StartInfo.FileName = "explorer";
    fileopener.StartInfo.Arguments = "\"" + path + "\"";
    fileopener.Start();
}
Jessie Lesbian
quelle
1
Das ist perfekt !
Francois Girard
1
Dies funktionierte für mich beim Öffnen von PDFs mit dem Standardprogramm. Danke dir!
Smitty-Werben-Jäger-Manjenson
1
@imgen Bei der Frage geht es darum, die Seitenzahl als Parameter anzugeben. Deckt diese Antwort das ab?
Daniloquio
1
@ Daniloquio Entschuldigung, ich habe die Frage nicht tief genug gelesen.
Imgen
2
Vergessen Sie nicht, es in einen using-Block zu verpacken. Process is IDisposable.
René Carannante
7

Ich habe den VB-Code in dem von xsl verknüpften Blog-Beitrag in C # konvertiert und ein wenig geändert:

public static bool TryGetRegisteredApplication(
                     string extension, out string registeredApp)
{
    string extensionId = GetClassesRootKeyDefaultValue(extension);
    if (extensionId == null)
    {
        registeredApp = null;
        return false;
    }

    string openCommand = GetClassesRootKeyDefaultValue(
            Path.Combine(new[] {extensionId, "shell", "open", "command"}));

    if (openCommand == null)
    {
        registeredApp = null;
        return false;
    }

    registeredApp = openCommand
                     .Replace("%1", string.Empty)
                     .Replace("\"", string.Empty)
                     .Trim();
    return true;
}

private static string GetClassesRootKeyDefaultValue(string keyPath)
{
    using (var key = Registry.ClassesRoot.OpenSubKey(keyPath))
    {
        if (key == null)
        {
            return null;
        }

        var defaultValue = key.GetValue(null);
        if (defaultValue == null)
        {
            return null;
        }

        return defaultValue.ToString();
    }
}

BEARBEITEN - das ist unzuverlässig. Siehe Suchen der Standardanwendung zum Öffnen eines bestimmten Dateityps unter Windows .

Ohad Schneider
quelle
3

Sie können mit versuchen

Process process = new Process();
process.StartInfo.FileName = "yourProgram.exe";
process.StartInfo.Arguments = ..... //your parameters
process.Start();
Aghilas Yakoub
quelle
-5

Fügen Sie unter Eigenschaften für das Projekt Einstellungen hinzu und verwenden Sie diese auf diese Weise. Sie haben saubere und einfach konfigurierbare Einstellungen, die standardmäßig konfiguriert werden können

Gewusst wie: Erstellen Sie zur Entwurfszeit eine neue Einstellung

Update: nach Kommentaren unten

  1. Rechts + Klicken Sie auf Projekt
  2. Füge neuen Gegenstand hinzu
  3. Unter Visual C # Items -> General
  4. Wählen Sie Einstellungsdatei
HatSoft
quelle
14
Falsche Registerkarte vielleicht? ;)
Ken2k