应用程序中的某个地方,我创建了一个Process
类型的proc
实例,如下所示:
proc = new Process();
proc.EnableRaisingEvents = true;
proc.StartInfo.FileName = Settings.Instance.OBSExeFile;
proc.Exited += (a, b) => doSomething();
proc.Start();
proc.WaitForInputIdle();
在Form.Closing
事件上,如果它仍然打开,我想轻轻地关闭它。
我发现没有其他方法可以使用 .NET 中的本机内容来做到这一点(Close()
、Kill()
和CloseMainWindow()
似乎都不符合我的需求),所以我开始向应用程序发送WM_CLOSE
并调用Process.WaitForExit()
,如下所示:
if (proc != null && !proc.HasExited) {
if(SendMessage(proc.MainWindowHandle, WM_CLOSE, 0, IntPtr.Zero) == 0)
proc.WaitForExit();
}
我的问题是:我是否错过了某种东西,因为混合了这种危险?例如,WaitForExit()
可以永远挂起吗?
根据您提供的信息,我认为好的方法是创建一个 Windows 服务而不是.exe。然后,您将完全控制过程。
在Windows服务中,您可以创建一个代码,当命令将发送到当前服务时stop
该代码"轻轻"关闭当前服务。
它发送一条消息,并让它自行关闭(以您认为合适的任何方式)。 我有一组程序可以做到这一点,为此我使用 udp 广播到 127.0.0.1。