none
プログラムアイコンにドロップした情報を受け取る RRS feed

  • 質問

  • Windows8.1 update1 Visual C# 2013EXPRESSを使用しております。

    プログラムのショートカットアイコンにファイルやフォルダをドロップして、
    それを受け取って動くプログラムを作りたいと思っています。
    調べてみて、Main関数の引数でstring[]として受ける方法と、
    System.Environment.GetCommandLineArgs()の返り値として受ける方法がありました。

    しかし、実際にどちらの方法を試してみても、プログラムがそれを受け取るように
    出来ていないのか、もっと別の要因があるのか、期待通りの動作をしてくれません。

    どんな感じ感というと、アイコンにファイルやフォルダをドロップしようとすると、
    普通はポップアップが表示されて「プログラム**で開く」と出るところ、何も出ず、
    ドロップした途端、プログラムアイコンが逃げてしまいます。
    何か、プログラム以前の問題って感じです。

    何か、足りない設定とか参照とか、ありうるのでしょうか?
    よろしくご教授お願いします。
    2014年7月5日 6:00

回答

  • ClickOnceの発行オプションで作られるショートカットはそういう物なのです。
    他のインストーラーにするに変更するにしても、ExpressエディションだとInstallShieldは入らないのでWixとかになっちゃいますしね。

    そういうわけで、たとえばDOBON.NETさんのところにあるようなコードで、インストール時の初回実行のmain内で、自前でショートカットの作成を行ってください。
    そうすれば、あとはSystem.Environment.GetCommandLineArgsなどで引数を取得できます。

    #最近復活したセットアッププロジェクトでもアドバタイズショートカットだったりして素直に取れなかったり

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク Tolbie 2014年7月7日 0:31
    2014年7月5日 13:05

すべての返信

  • どんな感じ感というと、アイコンにファイルやフォルダをドロップしようとすると、
    普通はポップアップが表示されて「プログラム**で開く」と出るところ、何も出ず、
    ドロップした途端、プログラムアイコンが逃げてしまいます。
    何か、プログラム以前の問題って感じです。
    例えばメモ帳はドロップを受け付けていますので、同じ操作をメモ帳に対しても実行してみてください。「プログラムアイコンが逃げてしま」うようであれば、プログラム以前の問題で、質問者さんがWindowsの操作方法を知らないだけということになるかと思います。
    # もしかしてタスクバーにピン留めされたアイコンに対してドロップしようとしていますか?
    2014年7月5日 7:37
  • 早速の回答ありがとうございます。

    メモ帳のショートカットをデスクトップにコピーして、同様にやってみたところ、

    やはり期待通り、「+メモ帳で開く」と表示され、ドロップした瞬間、メモ帳が開きました。

    Windowsの操作方法ということですが、何か、特別な事が必要でしたでしょうか?

    実は忘れるくらい前に(XP時代だったかも)、同様のプログラムを何の注意も払わずに

    作って動作していたことがあり、今回かなり悩んでいます。

    2014年7月5日 9:35
  • う~ん…操作方法の問題だと思っているのですが…メモ帳では動作する操作方法なのですね。

    例えば、拡張子を非表示にしているがために、実行ファイルだと思っていたものが実は異なるファイルだったりはしませんか? ~.exe.configファイルとか。

    2014年7月5日 10:45
  • 実行ファイルではなく、ショートカットなんですが、拡張子の非表示とは何に対する表示のことですか?

    実は、他のプログラムアイコンと違うのが気になっています。他の例えばメモ帳のショートカットは、

    「種類;アプリケーション」となっていますが、私のプログラムは「種類:Application Reference (.appref-ms)」

    となっています。実際、プログラム本体が何処にあるのか分からず、直接ドロップさせてみることも出来ません。

    ClickOneceとか言うのがカギなのでは、と思っていますが、よく分かりません。引き続きよろしくお願いします。

    2014年7月5日 11:31
  • なぜClickOnceを使用しているのでしょうか?
    2014年7月5日 12:20
  • ClickOnceの発行オプションで作られるショートカットはそういう物なのです。
    他のインストーラーにするに変更するにしても、ExpressエディションだとInstallShieldは入らないのでWixとかになっちゃいますしね。

    そういうわけで、たとえばDOBON.NETさんのところにあるようなコードで、インストール時の初回実行のmain内で、自前でショートカットの作成を行ってください。
    そうすれば、あとはSystem.Environment.GetCommandLineArgsなどで引数を取得できます。

    #最近復活したセットアッププロジェクトでもアドバタイズショートカットだったりして素直に取れなかったり

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク Tolbie 2014年7月7日 0:31
    2014年7月5日 13:05
  • 他に出来上がったものをインストールする手段を知らないからです。

    次の回答者様の推薦の方法を検討してみます。

    ちなみに、ProjectフォルダにあるBinの中のプログラムに直接ドロップしてみたら、

    やはり、期待通りの動作をしました。

    自分だけしか使わないプログラムなので、最悪、そのショートカットを作っても良い気もしてきました。

    回答ありがとうございました。

    2014年7月5日 15:13
  • 回答ありがとうございました。

    やはり、ClickOneceではダメなのですね。

    教えていただいた方法を検討してみます。ただ、どちらも理解し切るまでには道程が長そうです。

    今日はもう遅いので、明日以降試してみます。

    ご教授ありがとうございました。

    2014年7月5日 15:18
  • ClickOnceの基本目的はWeb上から実行することです。Webという性格上、またセキュリティ面もありローカルファイルを意識するものではありません。…とはいえ関連付けなどもできるそうですが。

    インストーラーを作るのが難しいのであればZIPファイルにまとめるのではダメですか? ショートカットにドラッグ&ドロップという操作は開発者視点でなく利用者視点に見えます。つまり、プログラムをどのように起動するかは利用者の好みの問題で、開発者が強要するものでもないと思います。
    # 起動できるように手段を用意することはいいことですが。

    2014年7月5日 23:25
  • インストーラは、作った製品を第三者に使ってもらうために、その製品を起動できるようにするためのアプリケーションです。

    ちなみに、ClickOnce は、インストーラの形式の一種です。

    本題。

    自分で作って自分で使うのであれば、わざわざインストーラを作ってインストールするのではなく、ショートカットがほしければ、Altキーを押しながら、ショートカットがほしいところにEXEをドラッグドロップや、該当フォルダ上で、コンテキストメニューから、ショートカット作成を選ぶ形式をお勧めします。

    おそらく、今回の問題はそれで解決できます。

    最初にも書きましたが、インストーラはあくまでも第三者に使ってもらうためのものであって、作成者本人が自分のマシンで使うツールのために用意されたものではありません。

    自分のPC上で自分で作ったアプリのインストーラを実行するのは、そうしなければ動かせない別の理由(例えば、別アプリの機能拡張など)がある場合だけです。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    2014年7月7日 3:59