我想在我的Windows服务中加载OnStart()方法中的表单;这是我的代码。它不起作用。你能帮忙吗?
protected override void OnStart(string[] args)
{
Form1 fr = new Form1();
fr.Show();
}
答案 0 :(得分:2)
您不能以这种方式使用服务。服务无法直接与桌面交互,因为它们在登录用户会话中以另一个WindowsStation运行。您需要创建另一个与您的服务进行通信的应用程序。
如何进行沟通,您可以在MSDN和in this example上阅读。一些想法也已在StackOverflow上进行了描述。
答案 1 :(得分:1)
服务在不同的窗口站和桌面上运行到任何交互式用户。即使表单已成功加载,也无法看到它。
您可以设置“允许服务与桌面交互”服务选项,该选项允许服务共享控制台的窗口站。但是,这是一个非常糟糕的主意。它打开了安全漏洞和许多其他问题。例如。如果有多个用户登录会发生什么?或者,如果您正在运行终端服务?
更传统的设计是让客户端应用程序处理UI并与后台运行的服务进行通信。
答案 2 :(得分:0)
GUI需要单线程公寓线程模型。表单需要一个消息泵(如Application.Run
启动的那个)。
服务绝对不是为了显示GUI(甚至交互式服务被认为是不好的做法),但它可以通过GUI进行控制。
答案 3 :(得分:0)
对于显示窗口的服务,必须将其标记为“允许与桌面交互”。这可以由服务安装程序或该服务的属性页完成。
但这还不足以让窗口可靠地显示。实际上,您必须确定当前是否有用户登录并获取其桌面。这不是一项微不足道的工作,可能成为安全问题的根源。如果当前没有人登录,那你就不走运了。
最好的解决方案是拥有一个单独的GUI应用程序,通过某种IPC机制与服务进行通信。