这似乎是一个不可能完成的任务。 我找到的所有方法都没有用。 问题是如何干净地关闭使用Process.Start启动的控制台应用程序,该程序已经启动但没有控制台窗口且未使用shell execute启动:(
已知,如果该应用程序接收到ctrl-c或ctrl-break信号,则它将“干净”地关闭,但似乎没有可行的方法发送这样的信号(特别是GenerateConsoleCtrlEvent)。
在有人提供可行示例或导致可行示例的代码之前,此问题仍未得到解答。 我看到许多人都在问这个问题,也看到了很多答案,但它们都不起作用。 .NET似乎没有提供支持以进程ID方式干净地关闭控制台应用程序的功能,这很奇怪,因为它是使用.NET Process对象启动的。 问题的一部分是无法在新进程组中创建进程,这使得使用GenerateConsoleCtrlEvent毫无意义。 必须有解决方案。
ProcessStartInfo.CreateNoWindow = true; ProcessStartInfo.UseShellExecute = false;
)。已知,如果该应用程序接收到ctrl-c或ctrl-break信号,则它将“干净”地关闭,但似乎没有可行的方法发送这样的信号(特别是GenerateConsoleCtrlEvent)。
- Process.Kill无效。 强制终止进程会留下损坏的文件。
- Process.CloseMainWindow 无效。 在这种情况下没有主窗口,因此该函数返回false并且不起作用。
- 在处理进程的所有线程上调用EnumThreadWindows并向每个窗口发送WM_CLOSE不起作用,而且也没有任何线程窗口。
- GenerateConsoleCtrlEvent不起作用。 它只对同一组中的进程有用(.NET无法控制),并带有关闭调用进程的副作用。 该函数不允许指定进程ID。
在有人提供可行示例或导致可行示例的代码之前,此问题仍未得到解答。 我看到许多人都在问这个问题,也看到了很多答案,但它们都不起作用。 .NET似乎没有提供支持以进程ID方式干净地关闭控制台应用程序的功能,这很奇怪,因为它是使用.NET Process对象启动的。 问题的一部分是无法在新进程组中创建进程,这使得使用GenerateConsoleCtrlEvent毫无意义。 必须有解决方案。
GenerateConsoleCtrlEvent
。所以你只需要弄清楚如何在一个新组中创建进程。如果使用 .NET 进程包装器不可能实现,那就降到本地的 Win32 函数。使用 P/Invoke 没有任何伤害,因为你已经在为GenerateConsoleCtrlEvent
这个函数使用它了。 - Cody Grayunsafe
代码块。您可以在不支持原始指针的VB.NET中完成它。只是有点麻烦。您必须利用Marshal
类中的方法。我不知道为什么您要避免使用P/Invoke,这似乎是不合逻辑的。是的,为了访问Win32的强大功能,您需要做更多的工作。没有包装器是完美的。这就是为什么在学习了C#之后,我回到了C++和Win32的原因之一。 - Cody Gray