C# - 从 Windows 服务启动 Windows 窗体 [重复]

Posted

技术标签:

【中文标题】C# - 从 Windows 服务启动 Windows 窗体 [重复]【英文标题】:C# - Launch a Windows Form from a Windows Service [duplicate] 【发布时间】:2018-05-14 07:45:29 【问题描述】:

我正在开发一个监视消息队列 (RabbitMQ) 的 Windows 服务。每当有消息在消息队列中排队时,Windows 服务中将触发一个事件,并启动一个 Windows 窗体应用程序,该应用程序将队列的消息作为命令行参数。

所有的编码部分都很好。在调试模式下,我已经验证了在队列中找到消息时是否触发了事件,是的,它确实触发了事件回调。但是当事件被触发时,我没有看到弹出窗口。以下是我尝试执行 windows 窗体的方式。

Process process = new Process();
process.EnableRaisingEvents = true;
process.Exited+= <exit event handler>
process.Start(new ProcessStartInfo()
       CreateNoWindow=true,
       UseShellExecute=false,
       ErrorDialog=true,
       FileName = "<path to the .exe file of windows form>",
       WindowStyle=ProcessWindowStyle.Hidden
);
process.WaitForExit();

我什至没有看到任何错误抛出或登录 EventViewer。感谢您提供这方面的任何帮助。

【问题讨论】:

作为一种规范,服务不会与桌面交互,因为它们处于 UI 不可用的级别 从服务中启动进程到底有什么问题?也许只是 Windowstyle 不应该是“隐藏的” @nabuchodonossor 我也试过了,但还是没有运气。我只需要从 Windows 服务启动 GUI 应用程序。 @praveen:我刚刚了解到,用户交互的限制包括启动程序。我认为你必须做一些技巧。也许您可以写入事件日志,如果是这样,您可以触发应用程序启动。 【参考方案1】:

从 Windows Vista 开始,Windows 服务就被禁止与桌面交互。他们根本没有得到interactive session。虽然您可以在服务注册期间覆盖它,但这不是您应该认真考虑的事情。该选项可能很快就会完全消失。我什至不知道它是否仍然存在于 Windows 10 中。

他们仍然可以使用right tricks 启动交互式程序,包括子程序上的适当清单。但通信随后通过IPC。也许您也可以采用单实例方法,但现在这些方法有点过时了。

【讨论】:

以上是关于C# - 从 Windows 服务启动 Windows 窗体 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Windows 服务 C# 取消关机

为nginx创建windows服务自启动

C# 无法创建将启动的 Windows 服务

C# .net windows服务启动多个服务 ServiceBase

C#判断程序是由Windows服务启动还是用户启动

这个例子展示了如何用C#编程实现启动停止和重启Windows服务。