c # otwórz plik z domyślną aplikacją i parametrami

105

Najłatwiejszym sposobem otwarcia pliku za pomocą domyślnej aplikacji jest:

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

Chciałbym jednak wiedzieć, czy istnieje sposób na ustawienie parametrów w domyślnej aplikacji, ponieważ chciałbym otworzyć plik PDF o określonym numerze strony.

Wiem jak to zrobić tworząc nowy proces i ustawiając parametry, ale w ten sposób muszę wskazać ścieżkę do aplikacji i chciałbym mieć aplikację przenośną i nie musieć za każdym razem ustawiać ścieżki do aplikacji Korzystam z aplikacji na innym komputerze. Mój pomysł jest taki, że oczekuję, że komputer ma zainstalowany czytnik pdf i mówi tylko, co otworzyć stronę.

Dzięki.

Álvaro García
źródło
Czy masz na myśli wysyłanie parametrów do pliku wykonywalnego Adobe, a nie do pliku pdf, ale bez używania pełnej ścieżki?
Bali C,
2
Jak spodziewasz się, że to zadziała? Jeśli nie znasz ścieżki do aplikacji, nie wiesz, która jest domyślna przeglądarka plików PDF i nie wiesz, jakiego formatu parametrów użyć.
ken2k
2
Nie wystarczy powiedzieć myProcess.StartInfo.FileName = "Acrobat.exe";bez podania pełnej ścieżki do aplikacji?
daniloquio
1
Spójrz na to pytanie SO, aby zobaczyć, że pomaga
Mark Hall,
2
@daniloquio: Myślę, że chodzi o to, że OP nie wie, co użytkownik końcowy zainstalował na swoim komputerze, aby czytać pliki Adobe, może to być Acrobat, Acrobat Reader lub coś innego.
Surfbutler

Odpowiedzi:

45

Jeśli chcesz, aby plik był otwierany za pomocą domyślnej aplikacji, to znaczy bez określania programu Acrobat lub Reader, nie możesz otworzyć pliku na określonej stronie.

Z drugiej strony, jeśli nie masz nic przeciwko określaniu programu Acrobat lub Reader, czytaj dalej:


Możesz to zrobić bez podawania pełnej ścieżki programu Acrobat, na przykład:

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();

Jeśli nie chcesz, aby plik PDF otwierał się w programie Reader, ale w programie Acrobat, zmień drugą linię w następujący sposób:

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

Możesz wysłać zapytanie do rejestru, aby zidentyfikować domyślną aplikację do otwierania plików PDF, a następnie odpowiednio zdefiniować FileName w StartInfo procesu.

Postępuj zgodnie z tym pytaniem, aby uzyskać szczegółowe informacje na ten temat: Znalezienie domyślnej aplikacji do otwierania określonego typu pliku w systemie Windows

daniloquio
źródło
2
+1 Myślę też, że możliwe jest wyszukanie w rejestrze aplikacji skojarzonej z dowolnym typem pliku, np. „.Pdf”, a następnie umieszczenie tej nazwy w parametrze nazwy pliku. Zobacz stackoverflow.com/questions/162331/…
Surfbutler,
Czy istnieje jakiś parametr otwarty, aby program Adobe Reader otwierał w widoku 2 stron? Ciekawe, gdyby ktoś wiedział, to byłoby naprawdę przydatne. Rozglądałem się, ale nic nie mogę znaleźć.
taki Martillo
20

to powinno być blisko!

public static void OpenWithDefaultProgram(string path)
{
    Process fileopener = new Process();
    fileopener.StartInfo.FileName = "explorer";
    fileopener.StartInfo.Arguments = "\"" + path + "\"";
    fileopener.Start();
}
Jessie Lesbian
źródło
1
To idealne !
Francois Girard,
1
Pomogło mi to w otwieraniu plików PDF w domyślnym programie. Dziękuję Ci!
Smitty-Werben-Jager-Manjenson
1
@imgen pytanie dotyczy podania numeru strony jako parametru. Czy ta odpowiedź to pokrywa?
daniloquio
1
@daniloquio przepraszam, nie przeczytałem wystarczająco szczegółowo pytania.
imgen
3
Nie zapomnij zawinąć go w using blok, Process is IDisposable.
René Carannante
7

Przekonwertowałem kod VB w poście na blogu połączonym przez xsl do C # i trochę go zmodyfikowałem:

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();
    }
}

EDYCJA - to jest zawodne. Zobacz Znajdowanie domyślnej aplikacji do otwierania określonego typu pliku w systemie Windows .

Ohad Schneider
źródło
3

możesz spróbować

Process process = new Process();
process.StartInfo.FileName = "yourProgram.exe";
process.StartInfo.Arguments = ..... //your parameters
process.Start();
Aghilas Yakoub
źródło
-5

Proszę dodać ustawienia we właściwościach projektu i korzystać z nich w ten sposób, aby uzyskać czyste i łatwe do skonfigurowania ustawienia, które można skonfigurować jako domyślne

Instrukcje: tworzenie nowego ustawienia w czasie projektowania

Aktualizacja: po komentarzach poniżej

  1. Kliknij prawym przyciskiem myszy projekt
  2. Dodaj nową pozycję
  3. W obszarze elementy języka Visual C # -> Ogólne
  4. Wybierz plik ustawień
HatSoft
źródło
14
Może zła karta? ;)
ken2k