web-dev-qa-db-ja.com

Vb.NETまたはC#を使用してプロセスを強制終了するにはどうすればよいですか?

ユーザーが既にMicrosoft Wordを開いているかどうかを確認する必要があるシナリオがあります。もしそうなら、私はwinword.exeプロセスを強制終了し、コードの実行を続けなければなりません。

Vb.netまたはc#を使用してプロセスを強制終了するための簡単なコードはありますか?

69
bugBurger

System.Diagnostics.Process.Kill メソッドを使用する必要があります。 System.Diagnostics.Proccess.GetProcessesByName を使用して、必要なプロセスを取得できます。

例はすでにここに投稿されていますが、.exe以外のバージョンの方がうまく機能していることがわかりました。

foreach ( Process p in System.Diagnostics.Process.GetProcessesByName("winword") )
{
    try
    {
        p.Kill();
        p.WaitForExit(); // possibly with a timeout
    }
    catch ( Win32Exception winException )
    {
        // process was terminating or can't be terminated - deal with it
    }
    catch ( InvalidOperationException invalidException )
    {
        // process has already exited - might be able to let this one go
     }
}

おそらくNotSupportedExceptionを扱う必要はありません。これは、プロセスがリモートであることを示唆しています。

93
Blair Conrad

Wordプロセスを完全に強制終了することは可能ですが(他の返信の一部を参照)、完全に失礼で危険です。ユーザーが開いているドキュメントに重要な未保存の変更がある場合はどうでしょうか。古い一時ファイルは言うまでもありませんが、これは後に残します...

この点に関しては、おそらくこれが可能です(VB.NET)。

    Dim proc = Process.GetProcessesByName("winword")
    For i As Integer = 0 To proc.Count - 1
        proc(i).CloseMainWindow()
    Next i

これにより、開いているすべてのWordウィンドウが整然と閉じられます(該当する場合、ユーザーに作業を保存するように求められます)。もちろん、ユーザーはこのシナリオでいつでも「キャンセル」をクリックできるので、このケースも処理できるはずです(「すべてのWordインスタンスを閉じてください。さもないと続行できません」ダイアログを表示することをお勧めします... )

24
mdb

すべてのワードプロセスを強制終了する簡単な例を次に示します。

Process[] procs = Process.GetProcessesByName("winword");

foreach (Process proc in procs)
    proc.Kill();
15
Nick Berardi

セキュリティ上の懸念を回避し、Wordプロセスが実行されているかどうかを確認し、ユーザーにそれを閉じるように要求して、アプリの[続行]ボタンをクリックするだけで、多くのpoliterアプリケーションを作成できます。これは、多くのインストーラーが採用しているアプローチです。

private bool isWordRunning() 
{
    return System.Diagnostics.Process.GetProcessesByName("winword").Length > 0;
}

もちろん、アプリにGUIがある場合にのみこれを行うことができます

5
Chris Lawlor
    public bool FindAndKillProcess(string name)
    {
        //here we're going to get a list of all running processes on
        //the computer
        foreach (Process clsProcess in Process.GetProcesses()) {
            //now we're going to see if any of the running processes
            //match the currently running processes by using the StartsWith Method,
            //this prevents us from incluing the .EXE for the process we're looking for.
            //. Be sure to not
            //add the .exe to the name you provide, i.e: NOTEPAD,
            //not NOTEPAD.EXE or false is always returned even if
            //notepad is running
            if (clsProcess.ProcessName.StartsWith(name))
            {
                //since we found the proccess we now need to use the
                //Kill Method to kill the process. Remember, if you have
                //the process running more than once, say IE open 4
                //times the loop thr way it is now will close all 4,
                //if you want it to just close the first one it finds
                //then add a return; after the Kill
                try 
                {
                    clsProcess.Kill();
                }
                catch
                {
                    return false;
                }
                //process killed, return true
                return true;
            }
        }
        //process not found, return false
        return false;
    }
5
Vova Popov

トレイアプリでは、ExcelとWordの相互運用機能を削除する必要がありました。したがって、この単純なメソッドはプロセスを一般的に強制終了します。

これは一般的な例外ハンドラを使用しますが、他の回答で述べられているように複数の例外に簡単に分割できます。私のロギングが多数の誤検知を生成する場合(つまり、すでに殺された人を殺すことができない場合)これを行うことができます。しかし、これまでのところガイド(仕事の冗談)。

/// <summary>
/// Kills Processes By Name
/// </summary>
/// <param name="names">List of Process Names</param>
private void killProcesses(List<string> names)
{
    var processes = new List<Process>();
    foreach (var name in names)
        processes.AddRange(Process.GetProcessesByName(name).ToList());
    foreach (Process p in processes)
    {
        try
        {
            p.Kill();
            p.WaitForExit();
        }
        catch (Exception ex)
        {
            // Logging
            RunProcess.insertFeedback("Clean Processes Failed", ex);
        }
    }
}

これは私がそれを呼んだ方法です:

killProcesses((new List<string>() { "winword", "Excel" }));
2
tyler_mitchell

このような何かが動作します:

foreach ( Process process in Process.GetProcessesByName( "winword" ) )
{
    process.Kill();
    process.WaitForExit();
}
1
Tomer Gabel

プロセスが実行されているかどうかを検出し、ユーザーに手動で閉じるように指示する方が、実践的で、安全で、より丁寧です。もちろん、タイムアウトを追加し、プロセスがなくなった場合はプロセスを強制終了することもできます...

0
MrVB.NET