- PR -

C# Process.Start()において外部アプリケーションを起動

投稿者投稿内容
笊頭刹那
ベテラン
会議室デビュー日: 2005/10/17
投稿数: 55
お住まい・勤務地: オーストラリア
投稿日時: 2005-10-17 18:44
Process.Startで外部アプリケーション(やファイル・フォルダ)を起動するソフトを作っているのですが、同パスのものが多重起動できません。

string path1=@"c:\<something>.exe";
string path2=@"c:\<something>.exe";

Process.Start(path1);
Process.Start(path2);

// ここまではOKなんです、ウィンドウが二つ表示されます

Process.Start(path1);

// ここですでに起動されたpath1のウィンドウがアクティブになる

コードを書き換える前はちゃんと重複起動していただけあってわけが分かりません(汗。
コードを書き換えというのはコードが汚れたので別のフォームに書き換えたというだけで、起動プロセスの部分はProcess.Startを書き換える前も使用していました(まったく同じコードかどうかは自信がないですが、この問題が起こるまでProcess.StartについてはProcess.StartInfoが存在すよということぐらいしか頭に入っていなかったので、とくに設定などせず起動していた…はずです。

CreateNoWindowの値もTrue/False双方試してみましたが結果は同じでした。

いったい何がいけないのでしょうか(汗。
ご存知の方がいらっしゃったらお知恵を拝借させてください。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-17 19:07
こんにちは。

結局3つ起動したいという事ですか?
ヘルプに
「プロセスが既に実行されている場合、追加のプロセス リソースは起動されません。代わりに、既存のプロセス リソースが再利用され、新しい Process コンポーネントは作成されません。」
と書いてますが、やりたい事は別ですか?
笊頭刹那
ベテラン
会議室デビュー日: 2005/10/17
投稿数: 55
お住まい・勤務地: オーストラリア
投稿日時: 2005-10-17 19:52
すばやい回答ありがとうございます

結局はランチャーを作っているんです、ですからボタンを押すたびに新しいウィンドウで起動してくれないと困ると…

「プロセスが既に実行されている場合、追加のプロセス リソースは起動されません。代わりに、既存のプロセス リソースが再利用され、新しい Process コンポーネントは作成されません。」

ということは、無理だと言うことですね↓なぜコード編集前(適当にイメージをつかむために組んだコード)では出来ていたのだろう…と思っていろいろやってみた結果"notepad.exe"と相対パスで渡してやると重複的に起動するらしいです、イメージつかむためだったので"notepad.exe"としか渡していなかったんですね(反省。

WindowScriptHostObjectとか使ってやったほうがいいですかね?WSHとProcess.Start()以外でファイルの関連付けまで考えて起動してくれる関数ってないですよね?↓↓レジストリにいくと

.jpg - shell - open - command -

の場合と

.jpg - <something>

<something> - shell - open - command -

の場合と…複雑なのであまりやりたくないんです(汗。

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-17 22:06
Start() は static の方だったんですね。失礼しました。
それならば複数起動しないとおかしいですね。

最初に提示された path1 と path2 は全く同じパスですか?
もし違っていて、path1 の方のアプリケーション自体が多重起動を許していないのなら、無理じゃないかな。(多分)
笊頭刹那
ベテラン
会議室デビュー日: 2005/10/17
投稿数: 55
お住まい・勤務地: オーストラリア
投稿日時: 2005-10-17 22:25
>Start() は static の方だったんですね。失礼しました。
>それならば複数起動しないとおかしいですね。

前回の書いてからおかしいなと思っていたんです、やはり複数起動が普通ですよね

エクスプローラーが重複起動しませんね、他起動しましたorz フォルダのショートカットで重複起動しなくてあせりすぎました(自爆

エクスプローラーは重複起動…するはずですよね(汗。なぜだろう???

Pathはまったく同じパスです(この場合はフォルダのパス)
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-17 22:52
引用:

Pathはまったく同じパスです(この場合はフォルダのパス)



成程。それは同じパスだからですね。
私の所では「マイコンピュータ」を2回連続でクリックしても、2つ起動しません。他のフォルダでも同じです。
ショートカットからフォルダを一つ開き、別のフォルダに移動してから、また同じショートカットからフォルダを開くと複数起動します。
エクスプローラが「既に同じフォルダが開かれているなら、そっちをアクティブにする」とかしてるんじゃあないですかね。
なのでこの場合は、Process が云々関係ないですね。

笊頭刹那
ベテラン
会議室デビュー日: 2005/10/17
投稿数: 55
お住まい・勤務地: オーストラリア
投稿日時: 2005-10-18 06:20
と、いうかエクスプローラーを複数個起動する場合というのがそれほど多くないことに気がつきましたorz

>エクスプローラが「既に同じフォルダが開かれているなら、そっちをアクティブにする」とかしてるんじゃあないですかね。
なのでこの場合は、Process が云々関係ないですね。

たしかにそのようですね、いろいろお手数かけてすいませんでした、ありがとうございます
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-18 09:09
囚人さんにプレゼントです。

コード:

    Private Sub OneMethod()
        Dim hProcess1 As System.Diagnostics.Process

        Try
            hProcess1 = System.Diagnostics.Process.Start("Explorer", "/n,C:\Hoge\")
        Finally
            If Not hProcess1 Is Nothing Then
                Try
                    hProcess1.Close()
                Finally
                    hProcess1.Dispose()
                End Try
            End If
        End Try

        Dim hProcess2 As System.Diagnostics.Process

        Try
            hProcess2 = System.Diagnostics.Process.Start("Explorer", "/n,C:\Hoge\")
        Finally
            If Not hProcess2 Is Nothing Then
                Try
                    hProcess2.Close()
                Finally
                    hProcess2.Dispose()
                End Try
            End If
        End Try
    End Sub


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)