2017-08-01 12 views
1

WPF C#アプリケーションでは、ユーザーは特定のメニューから「explorer.exe」プロセスを起動できます。条件プロセス特定のプロセスのインスタンス数を開始する

これは

Process.Start("explorer.exe"); 

で、いつものように達成されるしかし、私は、ユーザーがボタンをクリックすることで起動するよう代わりとして、多くの場合で、1つのインスタンスに同時プロセスのエクスプローラの量を制限する必要があります。

したがって、通常は、指定されたプロセスのインスタンス数 "explorer.exe"が実際に実行されているかどうかをカウントし、複数ある場合はProcess.Start()をブロックします。

問題は、私がカウント機能に突っ込んでいることです。ここで私が書いたものである:

static bool CountProcess(string name) { 
    return false; // by defualt it returns false. 
    int counter = 0; 

    while(true) { 
    counter = Process.GetProcessesByName(name).length; // get the quantity of processes for a given name. 
    if(counter > 1) { 
     return true; 
     break; 
    } 
    } 
} 

それから私はこのとしての機能を呼び出します。

if(countProcess("explorer")) { 
    // Do nothing. 
} else { 
    Process p = Process.Start("explorer.exe");  
} 

しかし後のビルドと実行与えられたプロセスを開くときに、アプリがstuckedなります。実際、Visual Studioはデバッグのフィードバックを提供しません。

この機能は、1)運用上、2)効率的になるようにリファクタリングするにはどうすればよいですか。

+0

構文エラー: 'GetProcessByname'はGetProcessByName' –

+1

は、なぜあなたはBEGで偽の権利を返さない'する必要があります関数のイニング? :D後のコードは決して動かないでしょうか? –

+0

また、何らかの理由であなたがそれを殺していない限り、おそらくエクスプローラのインスタンスが常に実行されます。 –

答えて

2

CountProcessメソッドでwhileループがあるのはなぜですか?それは単純でなければならない。

if(Process.GetProcessByName("explorer").Length == 0) 
{ 
    Process.Start("explorer.exe"); 
} 

=== === UPDATE

[OK]を、私はあなたの問題が何であるかを認識し始めています。これはexplorer.exeにされなかった場合は

- このコードは動作するはずです:

private static Process proc { get; set; } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (proc == null || proc.HasExited) 
     { 
      proc = Process.Start("explorer.exe"); 
     } 
    } 

それはプロセスがこれまでに作成されたかどうかをチェックします(最初の時間があれば - いない場合は、処理が可能 - 新しいものを始める拒否)した場合彼は2回目にクリックしますが、プロセスはnullではありませんが、proc.HasExited == falseでなければなりません(閉じなかった場合)

このコードを実行すると、おそらく新しいエクスプローラウィンドウが起動しますこれは新しく作成されたプロセスがすぐに終了するためです。

Open explorer window and wait for it to close

しかし、これは、他のコンピュータにインストールするクライアントアプリケーションであることをすれば、私は助言しません:あなたは、ここで提案されるようにレジストリを変更しようとすることができ

The reason that WaitForSingleObject returns immediately is that Explorer is a single-instance program (well, limited-instance)

:ので、これがありますプログラムで誰かのレジストリを変更する。

=== UPDATE 2 ====は

このソリューションは、以下の作品 - しかし、いくつかの制限は(あなたはCOM参照を追加する必要があります。「Microsoftインターネットコントロール」を) - その後、チェックをし、それは1つのエクスプローラウィンドウを開くことができますかとウィンドウと同じベースをまだ

using SHDocVw; 
    public bool ExistOpenedWindow() 
    { 
     ShellWindows _shellWindows = new SHDocVw.ShellWindows(); 
     string processType; 

     foreach (InternetExplorer ie in _shellWindows) 
     { 
      //this parses the name of the process 
      processType = Path.GetFileNameWithoutExtension(ie.FullName).ToLower(); 

      //this could also be used for IE windows with processType of "iexplore" 
      if (processType.Equals("explorer") && ie.LocationURL.Contains("C:/")) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     if (proc == null || !ExistOpenedWindow()) 
     { 
      proc = Process.Start("explorer.exe", @"C:\"); 
     } 
    } 

(コードの2つの異なる場所にスラッシュとバックスラッシュの違いに注意)開かれているだろう、あなたのベースパスを(選択した場合、「フォルダのパスを開始」 explorer.exeへの引数として送信されます)をC:/にします。もう一度ボタンをクリックすると、エクスプローラウィンドウが含まれているかどうかがチェックされますそのようなパスをINGの(あなたによって開いたりしない)

がここ比較:Start explorer.exe without creating a window C#

そしてここに:Is there a way to close a particular instance of explorer with C#?

=== UPDATE 3 ====

いくつかの考えた後 - 私はしましたワーキング溶液に来て管理:

​​
+0

このソリューションの問題は、値が常に1であることです。なぜですか?基本的には、常にexplorer.exeプロセスが1つ実行されますが、より多くのプロセスを起動する場合、カウント値は同じです。1. .lengthまたは.Count()を使用します。 – datelligence

+0

質問をカバーするために私の答えを更新しました。 – Piotr

+0

はあなたの答えを本当に感謝しますが、ユーザーは彼が望むだけ多くのプロセスを立ち上げることができます。私はただ一つのexplorer.exeプロセスを呼び出す必要があります。一つはデフォルトの実行プロセスの後にあるので、プロセスを数えれば、プロセスが1つしかないときにはプロセスを呼び出し、1より大きいプロセスを呼び出さないといけません。または.Count()メソッドは、explorer.exeプロセスが何回実行されていても、常に1の値を返します。 – datelligence

関連する問題