4

私のアプリケーションは私と同僚専用なので、Click-Once か copy-the-exe かは気にしません。Windows エクスプローラーで特定の拡張子のファイルをクリックし、プログラムを起動してそのファイルを開くことができるようにしたいと考えています。ファイル名を取得できません。

表向きの解決策:

http://blogs.msdn.com/b/avip/archive/2008/10/27/wpf-supporting-command-line-arguments-and-file-extensions.aspx

私が試しているコードは以下のとおりです。この時点で私がしようとしているのは、クリックしたファイルの名前をテキスト ボックスに入力することだけです。関連する無知は、Windowsエクスプローラーからクリックワンスアプリケーションを参照する方法についてだと思います。ビルドすると、setup.exe というファイル、Wis.application というファイルが作成されます。[セットアップ] をクリックしてインストールすると、"Click-once application reference" タイプのショートカットが作成されます。 C:\Users\ptom\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Wis". インストールによって作成されたそのショートカットにファイルを関連付け、setup.exe にファイルを関連付けてみました。ファイルをクリックすると、アプリケーションが起動しますが、AppDomain.CurrentDomain.SetupInformation.ActivationArguments が null であることが示されます。(「示す」によって つまり、テキスト ボックスには、null かどうかをテストした場所からのテキストが入力されます)。アプリをデバッグから実行するか、スタート メニューから実行すると、ActivationArguments が null ではなく、その ActivationData (string[]) が長さであることを示すコード パスに従って、期待どおりに動作します。 0.

app.xaml.cs のコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;

namespace Wis
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {

            // Check if this was launched by double-clicking a doc. If so, use that as the

            // startup file name.
            if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments == null)
            {
                this.Properties["DoubleClickedFileToLoad"] = "There were no activation arguments AGAIN";
            }
            else
            {
                if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null
                                   && AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Length > 0)
                {
                    this.Properties["DoubleClickedFileToLoad"] =
                    AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
                }
                else
                {
                    this.Properties["DoubleClickedFileToLoad"] = "Type in a file name";
                }
            }


        }
    }
}

ありがとう

4

2 に答える 2

3

First of all you should add file assoc for ClickOnce-publish (Select Project->Properties->Publish-Options->File Associations)
Then add Reference to "System.Deployment"
Then you could extract path in App.cs in such a manner, depending on type of startup (ClickOnce or Local)

    protected override void OnStartup(System.Windows.StartupEventArgs e)
    {
        var path = GetPath (e);
    }        

    private static string GetPath(StartupEventArgs e)
    {
        if (!ApplicationDeployment.IsNetworkDeployed)
            return e.Args.Length != 0 ? e.Args[0] : null;
        if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments == null)
            return null;
        var args = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData;
        return args == null || args.Length == 0 ? null : new Uri(args[0]).LocalPath;
    }
于 2010-11-20T17:17:07.620 に答える
3

チェックしましたEnvironment.GetCommandLineArgs()か?これは、アプリケーションが開始された引数を示しています。

アプリケーションがファイルに関連付けられている場合、引数の 1 つとしてファイル名を含める必要があります。

于 2010-11-20T17:11:51.017 に答える