【问题标题】:UI for windows service in dot netdot net 中 Windows 服务的 UI
【发布时间】:2012-12-13 13:58:43
【问题描述】:

我正在 dot net 中创建一个 Windows 服务来向我的朋友发送自动电子邮件。一切运作良好。现在我有一个要求,比如显示一个弹出窗口,上面写着邮件已发送或类似的东西。但我需要一些想法来实现这个逻辑。我认为不可能有 Windows 服务的 UI。所以我想创建另一个 Windows 应用程序来显示弹出消息,并在邮件发送后从 Windows 服务调用它。这只是想法,不确定这种方法是否正确。请指导我。

谢谢。

【问题讨论】:

    标签: .net windows-services


    【解决方案1】:

    IMO 最简单的方法是创建另一个 Windows 应用程序,它只会坐在托盘中并等待来自 Windows 服务的通知。对于通信,您可以使用 WCF。我有类似的解决方案,效果很好。

    看这个进程间通信的例子:

    http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

    【讨论】:

      【解决方案2】:

      我认为 Windows 服务不可能有 UI。

      那部分是correct:

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

      查看@Arun 的回答。

      因此,您需要一个带有与用户交互的 GUI 进程。要让这两个应用程序(服务和 GUI)进行通信,您必须查看 inter-process communication (IPC)。

      请参阅this question 了解可在 C# 中使用的 IPC 机制的概述,但通常建议使用 WCF。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          有关此主题的讨论,请参阅 Windows 服务常见问题解答中的 "Can a Windows Service have a GUI"。

          从技术上讲,WTSSendMessage function 将门打开(即使在现代版本的 Windows 上),但您最好设计一个“无头”服务应用程序并依赖另一个 GUI 组件与用户交互,正如其他人所建议的那样.

          【讨论】:

            【解决方案5】:

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

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

            MessageBox.Show("mailed succesfuly");
            

            【讨论】:

            • 很抱歉投反对票,但您的答案不正确。 Windows Vista 和使用 Session 0 Isolation 之后 - 在死区中有效地显示服务的任何 UI,这可能导致服务变得无响应。请参阅msdn.microsoft.com/en-us/library/windows/hardware/… 了解更多信息,
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-23
            • 2023-03-26
            • 1970-01-01
            • 2021-06-19
            • 2022-09-27
            • 2011-08-27
            • 2018-12-14
            相关资源
            最近更新 更多