2016-06-29 12 views
0

私はScreenScaper.exeを呼び出す2つのC#アプリケーションを持っています。終了すると、Screenscaper.exeと呼ばれるものが終了しないようにしたいので、特定のプロセスIDを終了します。C#の現在のアプリケーション関連プロセスをどのようにチェックしますか?

アプリケーションをプロセスIDでプログラムで終了するにはどうすればよいですか。これはまた、プログラムでアプリケーションを生成するときにProcessIDを取得する方法を意味します。

+0

MainApplicationがいくつかの子アプリケーションを起動し、MainApplicationが終了した場合にそれらを閉じることができますか? – Jan18101997

+0

メインアプリケーションでスクリーンスクラッププロセスが起動された場合、Process.startでscreenscrapperを起動していれば、メインアプリケーションのループを完全に終了してからProcess.Killを呼び出す前にあなたの産んだプロセス。メインアプリケーションは関連するスポーンされたプロセスのみを含みます。 – Bearcat9425

+0

ProcessNameの代わりにProcessIDでアプリケーションを区別する方法を聞いているようですが、これを反映するために質問を編集しました。 –

答えて

0

CreateToolhelp32Snapshot親(==関連する)プロセスIDを見つけるのに役立つかもしれません。

たとえば、親プロセスのないすべての "ScreenScraper.exe"プロセス(つまり、通常の終了プロセス中にハングアップしたプロセス)を強制終了したいとします。コードは次のようになります。

class Program 
{ 
    static void Main(string[] args) 
    { 
     string procName = "ScreenScraper"; // Mind no ".exe" extension here 
     foreach (var process in Process.GetProcessesByName(procName)) 
     { 
      try 
      { 
       var parent = myProcessEx.GetParentProcess(process.Id); 
       Console.WriteLine("{0} {1}; PARENT: {2} {3}", 
        process.Id, process.ProcessName, parent.Id, parent.ProcessName); 
      } 
      catch (ApplicationException exception) 
      { 
       if (exception.InnerException is ArgumentException) 
       { 
        Console.WriteLine("An orphan '{0}' process found with PID {1}. Killing it...", 
         process.Id, process.ProcessName); 
        process.Kill(); 
       } 
       else 
        throw; 
      } 
     } 
    } 
} 

myProcessExクラスはhttp://www.pinvoke.net/default.aspx/kernel32.createtoolhelp32snapshotのサンプルコードのセクションから取得されます。

終了した親プロセスIDは再利用することができます(https://stackoverflow.com/a/185298/4295017)ので、おそらく親チェックコードを少し詳しく説明する必要があります。

+0

これは非常に有望です!私は、実装を進める前にcreatetoolhelp32snapshotの詳細を見ていきますが、ありがとうございます! –

関連する問題