9

私は次の機能を持っています:

private void TakeOverAllScreens()
    {
        int i = 0;
        foreach (Screen s in Screen.AllScreens)
        {

            if (s != Screen.PrimaryScreen)
            {
                i++;
               Process.Start(Application.ExecutablePath, "Screen|" + s.Bounds.X + "|" + s.Bounds.Y + "|" + i);
            }
        }
    }

ご覧のとおり、PCの画面ごとにアプリケーションの個別のインスタンスが作成されます。

それらすべてを閉じるexit関数を作成するにはどうすればよいですか?この関数は、「メイン」インスタンスだけでなく、アプリの任意のインスタンスで機能する必要があります。

4

6 に答える 6

11

同じ名前のすべてのプロセスを終了できます。

var current = Process.GetCurrentProcess();
Process.GetProcessesByName(current.ProcessName)
    .Where(t => t.Id != current.Id)
    .ToList()
    .ForEach(t => t.Kill());

current.Kill();
于 2012-10-23T08:33:27.347 に答える
3

どうすればアプリケーションを閉じることができますか?

3つの一般的なオプションがあります。

  • それを完全に殺す
  • メインウィンドウがあり、従来どおりに動作すると仮定して、WM_CLOSEP/Invokingでそのウィンドウにメッセージを送信します。SendMessage
  • 協力したいと仮定して、カスタム通信チャネルを使用して、それ自体を終了するように指示します

アプリケーションをどのように閉じる必要がありますか?

プロセスを完全に強制終了するのは手間がかかるため、プロセスが終了したときに機密性の高い処理を行わないことがわかっている場合を除いて、決して試行しないでください。通常、これは最後の手段として使用されます。

メインウィンドウを閉じるように指示するには、最初にそのウィンドウが何であるかを学ぶ必要がありますHWND。これを行うには、トップレベルウィンドウのリストを確認するか、生成されたプロセスに何らかの方法でそれを通知させます。また、メインウィンドウを閉じるように要求すると、他のプロセスがそれ自体を終了することを決定することも前提としています(実際には、メッセージを完全に無視するなど、何かを行うことを決定できます)。このアプローチは妥当な最初の試みであり、通常は、自分でウィンドウを見つける必要がありますが、自分で制御できないプロセスで正常に機能します。

カスタム通信チャネルを使用すると、何が発生し、どのように実装できるかを完全に制御できますが、これはほとんどのコードを記述し、両方のアプリケーションへのソースアクセスが必要なアプローチです。

結論

状況によります。プロセスを強制終了しても何も中断されないことを1000%確信している場合、それは迅速で汚い解決策になります。それ以外の場合は、2つの「丁寧な」アプローチのいずれかを使用する必要があります。

于 2012-10-23T08:40:15.907 に答える
3

開いているプロセスを追跡する必要があります。

List<Process> opened = new List<Process>();

private void TakeOverAllScreens()
    {
        int i = 0;
        foreach (Screen s in Screen.AllScreens)
        {

            if (s != Screen.PrimaryScreen)
            {
                i++;
               opened.Add(Process.Start(Application.ExecutablePath, "Screen|" + s.Bounds.X + "|" + s.Bounds.Y + "|" + i));
            }
        }
    }

それで:

private void terminateAll()
{
      foreach (var p in opened) p.Kill();
}
于 2012-10-23T08:28:34.547 に答える
1

開いているすべてのプロセスをリストに入れると、プロセスを1つずつ強制終了できます。以下のコードを見てください:

private void TakeOverAllScreens()
{
    int i = 0;
    List<Process> allProcesses = new List<Process>();
    foreach (Screen s in Screen.AllScreens)
    {
        if (s != Screen.PrimaryScreen)
        {
            i++;
           allProcesses.Add(Process.Start(Application.ExecutablePath, "Screen|" + s.Bounds.X + "|" + s.Bounds.Y + "|" + i));
        }
    }

    foreach (Process proc in allProcesses)
    {
        proc.Kill();
    }
}
于 2012-10-23T08:33:38.477 に答える
1

この機能を試してください:

void ExitAll(string processName)
{
    foreach(Process p in Process.GetProcesses())
    {
        if (p.ProcessName.ToLower().Equals(processName.ToLower()))
            p.Kill();
    }
}
于 2012-10-23T08:35:10.577 に答える
1

私は常にコマンドを実行します

tskill notepad // to kill all instances of notepad

アプリ内から、次のように実行できます

Process.Start("cmd /k tskill " + Process.GetCurrentProcess().ProcessName)
于 2012-10-23T08:36:14.723 に答える