好吧,我试图从Windows服务产生的线程内部生成一个进程。目标是读取输出并打印到焦点窗口 - 光标在哪里。可能是一个坏主意,我不知道我不是一个c#程序员
当我调用函数本身时,产生进程的Anywho工作,但是当它在正在运行的服务中调用时,它不起作用。是否可以在服务中启动流程?
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 :(得分:6)
从服务开始流程当然是可能的。但是,服务在会话0内运行并且没有桌面。交互式用户在不同的会话中运行其桌面。因此,从服务启动时,在交互式会话中启动并运行进程非常具有挑战性。
为了说明所涉及的问题,以及纠正是多么棘手,请阅读:Launching an interactive process from Windows Service in Windows Vista and later。
最简单的方法是将您的服务分成两个不同的部分。一部分作为服务运行,另一部分作为交互式会话中的无窗口进程运行。这两个进程可以通过您喜欢的任何IPC机制进行通信。当服务想要启动一个进程时,它只是在交互式会话中向另一半发送一条消息,请求启动新进程。
答案 1 :(得分:0)
如果您需要在GUI之间进行交互并向用户显示某种反馈,为什么不在命名管道上实现WCF接口。在您的服务中托管它并提供“状态”API,甚至可以根据需要提供功能。这样,您就可以为系统上的任何用户提供gui,并且服务保持干净。
但正如@David Heffernan所提到的,它并不是真的建议从Windows服务创建gui,而是从Vista开始,它们在Session 0环境中创建。