c#デフォルトのアプリケーションとパラメーターでファイルを開く


103

デフォルトのアプリケーションでファイルを開く最も簡単な方法は次のとおりです。

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

ただし、特定のページ番号でPDFを開きたいので、デフォルトのアプリケーションにパラメーターを設定する方法が存在するかどうかを知りたいです。

新しいプロセスを作成してパラメーターを設定する方法を知っていますが、この方法でアプリケーションのパスを示す必要があり、ポータブルアプリケーションを作成し、毎回アプリケーションのパスを設定する必要がないようにしたいと思います他のコンピューターで使用しています。私の考えでは、コンピューターにPDFリーダーがインストールされていて、何を開くかを言うだけです。

ありがとう。


絶対パスを使用せずに、PDFファイルではなくAdobe実行可能ファイルにパラメーターを送信することを意味しますか?
バリC

2
これがどのように機能することを期待していますか?アプリケーションのパスがわからない場合は、どちらがデフォルトのPDFビューアであるかわからず、使用するパラメーター形式もわかりません。
ken2k 2012

2
myProcess.StartInfo.FileName = "Acrobat.exe";アプリケーションへの完全なパスを指定せずに言うだけでは不十分ですか?
daniloquio

1
このSOの質問を見て、それが役立つことを確認してください
Mark Hall

2
@daniloquio:要点は、アドビファイルを読み取るためにエンドユーザーがマシンにインストールしたものをOPが認識していないことだと思います。それは、Acrobat、Acrobat Readerなどです。
Surfbutler

回答:


43

デフォルトのアプリケーションでファイルを開く場合は、AcrobatまたはReaderを指定しないと、指定したページでファイルを開くことができません。

一方、AcrobatまたはReaderを指定することに問題がなければ、読み続けてください。


次のように、Acrobatの完全なパスを指定せずに実行できます。

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

PDFをReaderではなくAcrobatで開く場合は、次のように2行目を変更します。

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

レジストリを照会して、PDFファイルを開くデフォルトのアプリケーションを特定し、それに応じてプロセスのStartInfoでFileNameを定義できます。

それを行うことの詳細については、この質問に従ってください:Windowsで特定のファイルタイプを開くためのデフォルトのアプリケーションを見つける


2
+1また、レジストリで「.pdf」などの任意のファイルタイプに関連付けられたアプリケーションを検索し、その名前をファイル名パラメータに入力することも可能だと思います。stackoverflow.com/questions/162331/…を
Surfbutler

Adobe Readerを2ページ表示で開くためのオープンパラメーターはありますか?好奇心旺盛で、誰かが知っているなら、それは本当に便利でしょう。探し回っていましたが何も見つかりません。
taki Martillo 2014年

18

これは近いはずです!

public static void OpenWithDefaultProgram(string path)
{
    Process fileopener = new Process();
    fileopener.StartInfo.FileName = "explorer";
    fileopener.StartInfo.Arguments = "\"" + path + "\"";
    fileopener.Start();
}

1
それは最高です !
Francois Girard

1
これは、デフォルトのプログラムでPDFを開くのに役立ちました。ありがとうございました!
Smitty-Werben-Jager-Manjenson

1
@imgen問題は、ページ番号をパラメーターとして提供することです。この回答はそれをカバーしていますか?
daniloquio

1
@daniloquio申し訳ありませんが、質問を十分に読めませんでした。
imgen

2
これをusingブロックでラップすることを忘れないでください。Processis IDisposableです。
ルネCarannante

7

xslによってリンクされたブログ投稿のVBコードをC#に変換し、少し変更しました。

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

編集-これは信頼できません。Windowsで特定のファイルタイプを開くためのデフォルトアプリケーションの検索を参照してください。


3

あなたは試すことができます

Process process = new Process();
process.StartInfo.FileName = "yourProgram.exe";
process.StartInfo.Arguments = ..... //your parameters
process.Start();

-5

プロジェクトのプロパティの下に設定を追加し、このように使用して、デフォルトとして構成できるクリーンで簡単な構成可能な設定を使用してください。

方法:デザイン時に新しい設定を作成する

更新:以下のコメントの後

  1. 右+プロジェクトをクリック
  2. 新しいアイテムを追加
  3. Visual C#アイテム->一般
  4. 設定ファイルを選択

14
間違ったタブかもしれませんか?;)
ken2k 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.