DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

プロセスを強制的に終了する

ここでは、指定したプロセスを終了させる方法を紹介します。

なおここで紹介している方法はProcessクラスを使用しているため、まず終了させたいプロセスを表すProcessオブジェクトを取得する必要があります。これは、自分で作成したProcessであれば簡単ですが、そうでなければ結構大変です。目的のProcessオブジェクトを取得する方法については、以下のような記事を参考にしてください。

Process.Killメソッドを使用する

強制的にプロセスを終了するには、ProcessクラスのKillメソッドを使います。このメソッドはローカルコンピュータで実行されているプロセスにだけ使用でき、リモートコンピュータ上で実行中のプロセスには使用できません。

Killメソッドは非同期的に実行されます。プロセスが終了するまで待機するには、Process.WaitForExitメソッドを使います。

次の例では、メモ帳をすべて強制終了しています。

VB.NET
コードを隠すコードを選択
'notepadのプロセスを取得
Dim ps As System.Diagnostics.Process() = _
    System.Diagnostics.Process.GetProcessesByName("notepad")

For Each p As System.Diagnostics.Process In ps
    'プロセスを強制的に終了させる
    p.Kill()
Next
C#
コードを隠すコードを選択
//notepadのプロセスを取得
System.Diagnostics.Process[] ps =
    System.Diagnostics.Process.GetProcessesByName("notepad");

foreach (System.Diagnostics.Process p in ps)
{
    //プロセスを強制的に終了させる
    p.Kill();
}

グラフィカルインターフェイスのあるプロセスの終了を要求する

グラフィカルインターフェイスのあるプロセスを安全に終了させるためには、Process.Killを使用するのではなく、Process.CloseMainWindowメソッドを使用します。CloseMainWindowメソッドはプロセスのメインウィンドウにクローズメッセージを送信し、プロセスの終了を要求します。要求するだけですので、実際には終了しない可能性もあります。

下の例では、開いているすべてのメモ帳を閉じるように要求しています。

VB.NET
コードを隠すコードを選択
'notepadのプロセスを取得
Dim ps As System.Diagnostics.Process() = _
    System.Diagnostics.Process.GetProcessesByName("notepad")

For Each p As System.Diagnostics.Process In ps
    'クローズメッセージを送信する
    p.CloseMainWindow()

    'プロセスが終了するまで最大10秒待機する
    p.WaitForExit(10000)
    'プロセスが終了したか確認する
    If p.HasExited Then
        Console.WriteLine("メモ帳が終了しました。")
    Else
        Console.WriteLine("メモ帳が終了しませんでした。")
    End If
Next
C#
コードを隠すコードを選択
//notepadのプロセスを取得
System.Diagnostics.Process[] ps =
    System.Diagnostics.Process.GetProcessesByName("notepad");

foreach (System.Diagnostics.Process p in ps)
{
    //クローズメッセージを送信する
    p.CloseMainWindow();

    //プロセスが終了するまで最大10秒待機する
    p.WaitForExit(10000);
    //プロセスが終了したか確認する
    if (p.HasExited)
    {
        Console.WriteLine("メモ帳が終了しました。");
    }
    else
    {
        Console.WriteLine("メモ帳が終了しませんでした。");
    }
}
  • 履歴:
  • 2013/7/10 コードをより具体的に書き直した。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。