【问题标题】:Duplicate process start doesn't react as expected重复进程启动未按预期反应
【发布时间】:2018-11-07 11:34:20
【问题描述】:

我正在尝试使用 c# 打开一个进程并在它被关闭时对其做出反应。这项工作适合我:

private void StartProc()
    {
        var process = new System.Diagnostics.Process { StartInfo = { FileName = "PathTo.exe" } };
        process.Start();
        process.EnableRaisingEvents = true;
        process.Exited += this.Editor_Exited;
    }

    private void Editor_Exited(object sender, EventArgs e)
    {
        MessageBox.Show("Process canceled");
    }

假设我正在使用此代码打开一个文本编辑器。如果已经有此文本编辑器的实例,则代码将不会打开第二个实例,并且还会在 Editor_Exited 代码中立即跳转。

我希望代码打开一个新实例,不要跳入Editor_Exited代码。

【问题讨论】:

  • 我们在谈论哪个文本编辑器?如果实例已经存在,许多编辑器会自行关闭。
  • 看起来另一个应用程序的行为是立即关闭,如果它已经打开并且这不在您的控制范围内。并非总是如此,例如,您可以打开任意数量的notepad.exe 应用程序。
  • 没错。我希望它被配置为只允许一个实例,所以当你启动它时,它会检查它是否已经在运行,如果是,它就会退出。检查您的文本编辑器是否允许您控制它。
  • 这是 Visual Studio 代码。但是为什么会触发事件呢?我的意思是它是关闭的“旧”实例,而不是我打开的那个,对吗?也许我错了,VS只是不允许打开第​​二个实例,那么您有什么解决方案吗?而且我还认为 VS Code 将允许多个实例。
  • @DanielRose 这是不允许多个实例的文本编辑器。

标签: c# process system.diagnostics


【解决方案1】:
string processName = "PathTo.exe";

var process = new System.Diagnostics.Process { StartInfo = { FileName = processName  } };
if (process.Start())
{
  process.EnableRaisingEvents = true;
  process.Exited += this.Editor_Exited;
}
else
{
 var p = Process.GetProcessesByName(processName);
 p.WaitForExit();
}

我知道这不是你所要求的 100%,但它是一种解决方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2021-07-03
    • 2019-08-09
    • 2019-04-19
    相关资源
    最近更新 更多