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

时间:2011-03-06 15:11:31

标签: c# .net forms windows-services

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

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

4 个答案:

答案 0 :(得分:2)

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

如何进行沟通,您可以在MSDNin this example上阅读。一些想法也已在StackOverflow上进行了描述。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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