.NET中的Windows服务UI

3
我正在使用dot net创建一个Windows服务,以向我的朋友发送自动电子邮件。一切都运作良好。现在我有一个要求,需要显示一个弹出窗口,提示邮件已发送或类似内容。但我需要一些想法来实现这个逻辑。我认为Windows服务不可能拥有用户界面。因此,我考虑创建另一个Windows应用程序来显示弹出消息,并在邮件发送时从Windows服务调用此应用程序。这只是一个想法,不确定是否正确。请指导我。
谢谢。
5个回答

8
没有限制Windows服务不应该有任何GUI。Windows服务可以拥有GUI。但是,如果有GUI,则会在Service 0中显示。这在Vista之前的早期版本的Windows中是可能的。让我们详细讨论一下。
每当用户登录Windows时,都会创建一个登录会话。每个会话都有一个会话ID。所有的Windows服务都将在Session 0中运行。在Session 0中,用户可以看到并与其中运行的任何程序的图形元素进行交互,包括那些由早期版本的Windows NT、2000、XP和Server 2003创建的Windows服务。
后来由于安全问题,微软隔离了Session 0。影响是服务无法显示其GUI,这是其中之一。
考虑这种情况:一个服务尝试在Session 0中创建用户界面(UI),例如对话框。由于用户由于服务0的隔离而不在Session 0中运行,因此他或她从未看到UI,因此无法提供服务正在寻找的输入。服务似乎停止工作,因为它正在等待未发生的用户响应。
由于这种隔离,服务无法通过Windows消息与应用程序通信,反之亦然。我们使用RPC、交互式服务检测服务(ISDS)和IPC来实现服务和应用程序之间的通信。

3
我认为不可能为Windows服务提供用户界面。

这部分是正确的(参见@Arun的答案)

Microsoft Windows服务[...]不显示任何用户界面。

因此,您需要一个具有GUI的进程来与用户进行交互。要让这两个应用程序(服务和GUI)进行通信,您需要研究进程间通信(IPC)。

请参见此问题,了解可在C#中使用的IPC机制概述,但通常建议使用WCF。


2

1

请参阅Windows服务FAQ中的"Windows服务是否可以有GUI界面",以了解此主题的讨论。

从技术上讲,WTSSendMessage函数在现代版本的Windows上仍然存在(即使是最新的版本),但是像其他人建议的那样,您最好设计一个“无头”服务应用程序,并依赖于另一个GUI组件与用户进行交互。


-1

可以显示弹出框。您可以通过添加命名空间System.Windows.Forms将GUI添加到Windows服务中。在此之前,请右键单击解决方案资源管理器中的引用选项卡并添加此命名空间。

现在,您可以在其中使用任何GUI控件。 例如:

MessageBox.Show("mailed succesfuly");

1
很抱歉要投反对票,但您的答案是不正确的。Windows Vista及以后版本使用Session 0隔离 - 在一个死空间中有效地显示服务的任何UI,这可能导致服务变得无响应。请参见http://msdn.microsoft.com/en-us/library/windows/hardware/dn653293(v=vs.85).aspx获取更多信息。 - shadowf

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