質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

7575閲覧

関連付けファイルからClickOnceアプリ起動時の引数の取得方法について

nobody

総合スコア13

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

2グッド

2クリップ

投稿2017/09/29 01:37

編集2017/09/29 01:40

###前提・実現したいこと
現在Visual Studio 2017 C#で簡単なアプリを作成しております。
内容はPDFファイルを読み込んでフォームに表示して操作を行うものです。
インストーラー発行時にファイルの関連付けの設定を行って、
対象のファイルからダブルクリック起動時に引数でファイル名を受け取り、
読み込んだ形でアプリを起動したいと考えております。
なお、インストーラーはVisual Studioの「発行」を使用しています。

###発生している問題・エラーメッセージ
関連付けファイルからの起動時、ファイル名が引数として渡されません。

###該当のソースコード
Environment.GetCommandLineArgs()

###試したこと
インストール後に実行exeにファイルドラッグをしたり、コマンド実行だとうまく動作します。
そもそもClickOnceというものがあまり理解できていないのですが、そもそもOS側の関連付け情報に登録されておらず、clickonce application deployment support libraryというものが動いているようです。
ClickOnceでのURLパラメータの取得等記事はありましたが、そもそもローカルファイルのダブルクリックでURL形式で呼び出されるものなのか。。。

string url = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
string queryString = (new Uri(url)).Query;
MessageBox.Show(queryString);
こちらで確認しても結果、引数はありませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2017
C#

申し訳ありませんが、何か解決方法をご存知であればご教示いただけますと幸いです。

Tak1wa, hanhunhun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。
結論からですと、ファイルの拡張子に関連付けたファイルを起動した時に、
ClickOnceでは以下にファイル名が入っています。

AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0]

こちらの情報を参考にさせていただきました。
stack overflow: How to get command line from a ClickOnce application?

以下は、既にご存知かもしれませんが、参考の為に
ClickOnce アプリケーションのファイルの関連付けを作成する

動作の確認の為にテストプロを作りました。拡張子"tx4"に関連付けて、*.tx4なファイルを
ダブルクリックしたときに引数を出力するClickOnce対応のコンソールプログラムです。
AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData
は関連付けでの起動では無い場合にはnullになっているので、適時、スキップする必要があります。

コードを示します。下の方はSystem.Environment.GetCommandLineArgs()等との
比較の為に書いただけですので気にしないでください。
Visual Studio 2017 Professionalで作成し、Windows 7 64ビット版で確認しています。

C#

1 2using System; 3 4namespace ClickOnceTest01 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 Console.WriteLine("Main.START"); 11 Console.ReadKey(); 12 13 if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments != null) 14 { 15 // ClickOnceでの起動の場合 16 var data = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData; 17 if (data != null) 18 { 19 // ファイル名は AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0] 20 // に入っている。 21 Console.WriteLine("ClickOnce: " + data[0]); 22 23 // 確認の為、全要素を出力 24 for (int i = 0; i < data.Length; i++) 25 { 26 string msg = string.Format("ClickOnce data#{0}={1}", i, data[i]); 27 Console.WriteLine(msg); 28 } 29 } 30 } 31 32 // 普通に Main.args[] 33 if (args != null) 34 { 35 for (int i = 0; i < args.Length; i++) 36 { 37 Console.WriteLine("Main.args: " + args[i]); 38 } 39 } 40 41 // Environment.GetCommandLineArgs 42 var args2 = System.Environment.GetCommandLineArgs(); 43 for (int i = 0; i < args2.Length; i++) 44 { 45 Console.WriteLine("GetCommandLineArgs:" + args2[i]); 46 } 47 48 Console.WriteLine("Main.END"); 49 Console.ReadKey(); 50 } 51 } 52} 53 54

関連付けは、ClickOnceの設定画面で行っています。

イメージ説明

C:\project\test\ClickOnceTest01\publish\testdata.tx4 をダブルクリックしたとき
の実行結果です。"Main.START"の次の行で、引数のファイル名を出力しています。

イメージ説明

投稿2017/09/29 04:33

編集2017/09/29 04:42
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobody

2017/09/29 06:44

ご回答ありがとうございました。 取得方法自体は同じでしたが、FormのLoadイベントで取得しようとしていたものをサンプルに合わせてMainの方で取得したらうまく取れました。 大変助かりました。 ありがとうございます。
dodox86

2017/09/29 07:10 編集

> 取得方法自体は同じでしたが、FormのLoadイベントで取得しようとしていたものをサンプルに合わせて ごめんなさい、せっかく詳細に状況説明をされていたのに私の方が見落としていました。回答としては一部不適切なので、評価を下げてくださって結構です。よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問