6

が実行されているかどうかを確認するプロセスとして継続的に実行されるこのループがmstsc.exeあります。

for (; ; )
{
    System.Diagnostics.Process[] pname = System.Diagnostics.Process.GetProcessesByName("mstsc");

    if (pname.Length != 0)
    {

    }
    else
    {
        System.Diagnostics.Process.Start(@"mstsc.exe");
    }
    System.Threading.Thread.Sleep(3000);
}

問題は、ログオフ、再起動、またはシャットダウン時にこれが発生することです。

ここに画像の説明を入力

Form_Closing またはでプロセスを終了しようとしました

Microsoft.Win32.SystemEvents.SessionEnded += 
  new Microsoft.Win32.SessionEndedEventHandler(SystemEvents_SessionEnded);

そして、私はまだこれを理解しています...

このプロセスを正しく強制終了するにはどうすればよいですか?

4

4 に答える 4

6

これは、プロセスに子プロセスがある場合に発生します。プロセスツリー全体を強制終了する必要があります。

C# でプログラムによってプロセス ツリーを強制終了する

上記のリンクのコード ( Gravitas提供):

/// <summary>
/// Kill a process, and all of its children.
/// </summary>
/// <param name="pid">Process ID.</param>
private static void KillProcessAndChildren(int pid)
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
    ManagementObjectCollection moc = searcher.Get();
    foreach (ManagementObject mo in moc)
    {
        KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
    }
    try
    {
        Process proc = Process.GetProcessById(pid);
        proc.Kill();
    }
    catch (ArgumentException)
    {
        // Process already exited.
    }
}
于 2013-04-30T18:08:43.090 に答える
1

You can move the loop with Thread.Sleep to a separate background thread. That way, it will be silently killed when your process exits.

于 2013-04-30T17:13:01.250 に答える
0

1)ループを使用する代わりに、プロセスが終了したときにSystem.Diagnostic.Processにイベントを発生させることができます。

2) Thread.Sleep の代わりに Thread.Join を使用してましたか? これにより、メッセージがポンピングし続けます。そのため、スリープ中でも SystemEvent を受け取った場合は処理できます。

3) どんなアプリがありますか? コンソール アプリですか、それとも Windows フォーム / WPF アプリですか? Windows メッセージをポンピングするものはありますか (Dispatcher など)。

于 2013-04-30T18:00:04.443 に答える