我希望在我的Windows服务的OnStart()方法中加载一个表单; 这是我的代码。 但它不起作用。 你能否提供任何帮助?
protected override void OnStart(string[] args)
{
Form1 fr = new Form1();
fr.Show();
}
我希望在我的Windows服务的OnStart()方法中加载一个表单; 这是我的代码。 但它不起作用。 你能否提供任何帮助?
protected override void OnStart(string[] args)
{
Form1 fr = new Form1();
fr.Show();
}
服务运行在与任何交互用户不同的窗口站和桌面上。即使表单成功加载,也没有人能够看到它。
您可以设置“允许服务与桌面交互”服务选项,允许服务共享控制台的窗口站。然而,这是一个非常糟糕的想法。它会打开安全漏洞和一系列其他问题。例如,如果有多个用户登录会发生什么?或者如果您正在运行终端服务?
更常规的设计是由客户端应用程序处理UI并与在后台运行的服务进行通信。
GUI需要单线程公寓线程模型。表单需要消息泵(例如由Application.Run
启动的消息泵)。
服务绝对不是为了显示GUI而设计的(即使交互式服务也被认为是不好的实践),但可以通过GUI进行控制。
要让服务显示窗口,它必须被标记为“允许与桌面交互”。这可以通过服务安装程序或该服务的属性页面完成。
然而,仅此还不足以可靠地显示窗口。实际上,您需要确定当前是否有用户登录并获取他们的桌面。这不是一项微不足道的任务,可能会成为安全问题的源头。如果当前没有任何用户登录,则无法进行操作。
最好的解决方案是拥有一个单独的GUI应用程序,通过某些IPC机制与服务通信。