来自C#Windows服务的产卵过程

那么,我试图从一个Windows服务产生的线程内产生一个进程。 目标是读取输出并打印到焦点窗口 – 光标所在的位置。 可能是一个坏主意,我不知道我不是AC#程序员

当我调用函数本身时,任何产生这个过程的函数都可以工作,但是当它在一个正在运行的服务中被调用时,则不会。 是否可以在服务内启动一个进程?

Process proc = new Process(); proc.StartInfo.FileName = @"C:\file.bat"; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.UseShellExecute = false; proc.Start(); String outputMessage = proc.StandardOutput.ReadToEnd(); proc.WaitForExit(); 

从服务开始一个过程当然是可能的。 但是,服务在会话0内运行并且没有桌面。 交互式用户在不同的会话中运行桌面。 因此,从服务启动时,在交互式会话中启动并运行流程非常具有挑战性。

有关所涉及问题的说明以及如何正确使用这些问题,请阅读以下内容: 在Windows Vista及更高版本中从Windows Service启动交互式进程 。

最简单的方法是将您的服务分为两个不同的部分。 一部分作为服务运行,另一部分作为交互式会话中的无窗口进程运行。 这两个进程可以通过你喜欢的任何IPC机制进行通信。 当服务想要启动一个进程时,只需在交互式会话中向另一半发送一条消息来请求启动新进程。

如果您需要在GUI之间进行交互并向用户显示某种反馈,为什么不通过命名管道实现WCF接口。 将其托管在您的服务中,并在需要时提供“状态”API或甚至功能。 这样你就可以为系统中的任何用户提供一个gui,并且服务保持干净。

但是正如@David Heffernan所说的那样,它并不是真的推荐从windows服务中创建gui,而从Vista开始,他们在Session 0上下文中创建。