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