none
タスクバーからの起動の違いについて RRS feed

  • 質問

  • お世話になります。

    Windows10でアプリケーションを実行するとタスクバーにアイコンが出て、

    右クリックすると実行中のアプリケーションと同じ名前が表示されていますが、

    これをクリックするともう1つ新たにアプリケーションが起動されるかと思います。

    この動作について、ピン留めしているときとしていないときで差があるのですが、

    違いについての情報など教えていただけないでしょうか?

    2020年11月4日 8:18

回答

  • Shared や Nothing ということは Visual Basic での開発ですね。

    ピン留めしないでタスクバーを右クリックで起動した場合はセット出来ていないように見えます。

    それで変わるとすれば、CurDir や Directory.GetCurrentDirectory あたりですかね。
    外部ファイルの読み書きを行っている箇所はありませんか?

    もしファイルを利用している場合、ドライブレターからのフルパス指定になっているかを確認してみてください。

    例えば Assembly.GetExecutingAssembly を使って実行ファイルのパスを調べたり、 Environment.GetFolderPath や SpecialDirectories で既定の特殊ディレクトリ パスを得るといったことができます。

    変数はSharedで宣言し、初期処理の際に中身がNothingの場合はインスタンス生成を行っています。

    「初期処理」と書かれていますが、Shared 変数のセットは、どのタイミングで行っていますか?
    Main メソッドでしょうか。それとも、プロジェクトのプロパティの「アプリケーション」タブ右下にある「アプリケーション イベントの表示」の Startup イベントでしょうか。あるいはスタートアップフォームの コンストラクタ、Load イベント、Show イベント、OnLoad メソッド、OnShow メソッドなどでしょうか。

    • 回答としてマーク tori10 2020年11月10日 9:51
    2020年11月10日 2:35

すべての返信

  • MSDN (開発者向け) フォーラムですが、自製アプリというよりは一般的な話でしょうか。

    具体的にどう動作が異なるのか分かりませんでしたが、わたしの環境ではピン留めされていても
    同じような動作になっているように見えました。

    「ピン留めされたアプリについて、同じように右クリックからアプリ名をクリックしても二重起動しない」
    ということであれば、そのアプリが二重起動を抑止していないか確認してみてはいかがでしょうか。

    例えば、「メール」アプリなどは二重起動が抑止されているっぽいため、ピン留め後に右クリックから
    アプリ名をクリックしても新しく起動はされませんでした。

    一方で、コマンドプロンプトなどは右クリックからアプリ名をクリックすると、ピン留め後でも
    新しいプロセスが起動されます。

    2020年11月5日 17:24
  • 返信ありがとうございます。

    現象としては、exeをダブルクリックした場合とピン留めしたあとタスクバーを右クリックで起動した場合は、内部変数をちゃんとセット出来ているのですが、ピン留めしないでタスクバーを右クリックで起動した場合はセット出来ていないように見えます。

    変数はSharedで宣言し、初期処理の際に中身がNothingの場合はインスタンス生成を行っています。

    以前どこかでExcelのプロセスがあげ方によって同じプロセスで起動されるか、別れて起動されるか見た気がするのですが、そんな差があったりしないでしょうか?

    ご確認よろしくお願い致します。

    2020年11月10日 1:54
  • Shared や Nothing ということは Visual Basic での開発ですね。

    ピン留めしないでタスクバーを右クリックで起動した場合はセット出来ていないように見えます。

    それで変わるとすれば、CurDir や Directory.GetCurrentDirectory あたりですかね。
    外部ファイルの読み書きを行っている箇所はありませんか?

    もしファイルを利用している場合、ドライブレターからのフルパス指定になっているかを確認してみてください。

    例えば Assembly.GetExecutingAssembly を使って実行ファイルのパスを調べたり、 Environment.GetFolderPath や SpecialDirectories で既定の特殊ディレクトリ パスを得るといったことができます。

    変数はSharedで宣言し、初期処理の際に中身がNothingの場合はインスタンス生成を行っています。

    「初期処理」と書かれていますが、Shared 変数のセットは、どのタイミングで行っていますか?
    Main メソッドでしょうか。それとも、プロジェクトのプロパティの「アプリケーション」タブ右下にある「アプリケーション イベントの表示」の Startup イベントでしょうか。あるいはスタートアップフォームの コンストラクタ、Load イベント、Show イベント、OnLoad メソッド、OnShow メソッドなどでしょうか。

    • 回答としてマーク tori10 2020年11月10日 9:51
    2020年11月10日 2:35
  • 魔界の仮面弁士さん

    返信ありがとうございます。

    ご指摘の通り、原因は実行フォルダの違いによるものでした。

    ピン留めしているときはexeの場所から起動され、ピン留めしていないときは「c:\windows\system32」から起動されていました。

    そのため、起動時に相対パスで記述されたファイルの読み込みに失敗し、インスタンスを作成できていませんでした。

    大変勉強になりました。

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

    2020年11月10日 9:56