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

6

我希望在我的Windows服务的OnStart()方法中加载一个表单; 这是我的代码。 但它不起作用。 你能否提供任何帮助?

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

3
你不需要在服务中加载或展示表单,这正是重点! - Mitch Wheat
你为什么要尝试做这样的事情? - PedroC88
请注意,用户不会登录/注销服务。他们将登录和退出使用服务的应用程序。这样的应用程序应该提供数据。服务应该限制自己接收、处理并可能存储数据。 - PedroC88
@PedroC88:我能用任务计划程序吗???我是新手程序员,用户登录和注销时我能运行我的任务计划程序吗??? - Farna
那么你应该尝试并了解一下Windows审计...我对这个主题不是很了解,但我认为这可能是正确的方法。 - PedroC88
显示剩余4条评论
4个回答

5
您不能以这种方式使用服务。由于服务运行在登录用户会话的另一个WindowsStation中,无法直接与桌面交互。您需要创建另一个应用程序来与您的服务通信。
如何进行通信,请参阅MSDN此示例。一些想法也已在StackOverflow上描述。

2

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

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

更常规的设计是由客户端应用程序处理UI并与在后台运行的服务进行通信。


0

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

服务绝对不是为了显示GUI而设计的(即使交互式服务也被认为是不好的实践),但可以通过GUI进行控制。


0

要让服务显示窗口,它必须被标记为“允许与桌面交互”。这可以通过服务安装程序或该服务的属性页面完成。

然而,仅此还不足以可靠地显示窗口。实际上,您需要确定当前是否有用户登录并获取他们的桌面。这不是一项微不足道的任务,可能会成为安全问题的源头。如果当前没有任何用户登录,则无法进行操作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接