私はScreenScaper.exe
を呼び出す2つのC#アプリケーションを持っています。終了すると、Screenscaper.exe
と呼ばれるものが終了しないようにしたいので、特定のプロセスIDを終了します。C#の現在のアプリケーション関連プロセスをどのようにチェックしますか?
アプリケーションをプロセスIDでプログラムで終了するにはどうすればよいですか。これはまた、プログラムでアプリケーションを生成するときにProcessIDを取得する方法を意味します。
私はScreenScaper.exe
を呼び出す2つのC#アプリケーションを持っています。終了すると、Screenscaper.exe
と呼ばれるものが終了しないようにしたいので、特定のプロセスIDを終了します。C#の現在のアプリケーション関連プロセスをどのようにチェックしますか?
アプリケーションをプロセスIDでプログラムで終了するにはどうすればよいですか。これはまた、プログラムでアプリケーションを生成するときにProcessIDを取得する方法を意味します。
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)ので、おそらく親チェックコードを少し詳しく説明する必要があります。
これは非常に有望です!私は、実装を進める前にcreatetoolhelp32snapshotの詳細を見ていきますが、ありがとうございます! –
MainApplicationがいくつかの子アプリケーションを起動し、MainApplicationが終了した場合にそれらを閉じることができますか? – Jan18101997
メインアプリケーションでスクリーンスクラッププロセスが起動された場合、Process.startでscreenscrapperを起動していれば、メインアプリケーションのループを完全に終了してからProcess.Killを呼び出す前にあなたの産んだプロセス。メインアプリケーションは関連するスポーンされたプロセスのみを含みます。 – Bearcat9425
ProcessNameの代わりにProcessIDでアプリケーションを区別する方法を聞いているようですが、これを反映するために質問を編集しました。 –