我在dot net中创建一个Windows服务,以便向我的朋友发送自动发送电子邮件。一切都运作良好。现在我有一个要求,就是要显示一个弹出文件,说明邮件已发送或类似的东西。但我需要一些想法来实现这种逻辑。我认为不可能有Windows服务的UI。所以我想创建另一个Windows应用程序来显示弹出消息,并在邮件发送时从Windows服务调用它。这只是一个想法,并不确定这是正确的方法。请指导我。
感谢。
答案 0 :(得分:5)
没有限制,Windows服务不应该有任何GUI。 Windows服务可以有GUI。但如果有,它会显示在Service 0中。在Vista之前的早期版本的Windows中可能会出现这种情况。让我们对它进行详细讨论
只要用户登录Windows,就会创建登录会话。每个会话都有一个会话ID。所有Windows服务都将在Session 0中运行。
在会话0中,用户可以查看在那里运行的任何程序的图形元素并与之交互,包括Windows早期版本(如Windows NT,2000,XP和Server 2003)中由Windows服务创建的图形元素。
后来由于安全问题,微软隔离了Session 0.而且影响是服务无法显示自己的GUI。这是其中一种情况
考虑,服务尝试在会话0中创建用户界面(UI),例如对话框。由于服务0的隔离,用户未在会话0中运行,因此他或她从未看到UI,因此无法提供服务正在寻找的输入。该服务似乎停止运行,因为它正在等待没有发生的用户响应
由于这种隔离,服务无法通过Windows消息与应用程序通信,反之亦然。我们使用RPC,交互式服务检测服务(ISDS)和IPC进行服务和应用程序之间的通信。
答案 1 :(得分:3)
我认为使用Windows服务的UI是不可能的。
部分是correct:
Microsoft Windows服务[..]不显示任何用户界面。
请参阅@ Arun的回答。
因此,您需要一个带有 GUI的进程,它可以与用户进行交互。要让这两个应用程序(服务和GUI)进行通信,您必须查看inter-process communication(IPC)。
有关C#中可用的IPC机制的概述,请参阅this question,但一般建议使用WCF。
答案 2 :(得分:2)
IMO最简单的方法是创建另一个Windows应用程序,它只会放在托盘中并等待来自Windows服务的通知。对于通信,您可以使用WCF。我有类似的解决方案,效果很好。
请参阅此进程间通信示例:
http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication
答案 3 :(得分:1)
有关此主题的讨论,请参阅Windows服务常见问题解答中的"Can a Windows Service have a GUI"。
从技术上讲,WTSSendMessage function会打开门(即使在现代版本的Windows上),但是你会更好地设计一个“无头”服务应用程序并依赖另一个GUI组件与用户交互,就像其他人一样建议。
答案 4 :(得分:-1)
可以显示一个弹出框。您可以通过添加命名空间将GUI添加到Windows服务
System.Windows.Forms
。在此之前,右键单击解决方案资源管理器中的参考选项卡并添加此命名空间。
现在你可以使用任何gui控件了。 例如:
MessageBox.Show("mailed succesfuly");