如何在Windows服务中显示表单。

我想在我的Windows服务中加载OnStart()方法中的表单; 这是我的代码。 它不起作用。 你能帮忙吗?

protected override void OnStart(string[] args) { Form1 fr = new Form1(); fr.Show(); } 

你不能以这种方式使用服务。 服务无法直接与桌面交互,因为它们在登录用户会话中在另一台WindowsStation中运行。 您需要创建另一个与您的服务进行通信的应用程序。

如何进行通信,您可以在MSDN和此示例中阅读 。 StackOverflow上也已经描述了一些想法。

服务在不同的窗口站和桌面上运行到任何交互式用户。 即使表单成功加载,也没有人能够看到它。

您可以设置“允许服务与桌面交互”服务选项,该选项允许服务共享控制台的窗口站。 但是,这是一个非常糟糕的主意。 它打开了安全漏洞和许多其他问题。 例如,如果有多个用户登录会发生什么? 或者,如果您正在运行终端服务?

更传统的设计是让客户端应用程序处理UI并与后台运行的服务进行通信。

GUI需要单线程公寓线程模型。 表单需要一个消息泵(就像Application.Run启动的那样)。

服务绝对不是为了显示GUI(甚至交互式服务被认为是不好的做法),但它可以通过GUI进行控制。

对于显示窗口的服务,必须将其标记为“允许与桌面交互”。 这可以由服务安装程序或该服务的属性页完成。

但这并不足以让窗口可靠地显示出来。 实际上,您必须确定当前是否有用户登录并获取其桌面。 这不是一项微不足道的工作,可能成为安全问题的根源。 如果当前没有人登录,那你就不走运了。

最好的解决方案是拥有一个单独的GUI应用程序,通过某种IPC机制与服务进行通信。