【问题标题】:show a windows form from a window service从窗口服务显示一个窗口窗体
【发布时间】:2012-10-08 19:44:23
【问题描述】:

我正在创建一个窗口服务。我的要求是在特定时间间隔从窗口 NT 服务显示窗口窗体。出于测试目的,我只想在服务启动时显示表单:

 protected override void OnStart(string[] args)
        {
            eventLog1.WriteEntry("In OnStart -before form show");

            Messager_Form obj = new Messager_Form();
            obj.Show();
           // System.Diagnostics.Process.Start("calc.exe");
            eventLog1.WriteEntry("In OnStart -after form show");
           // timer1.Start();
        }

它不工作。既没有显示表单,也没有运行计算过程。我找到了一些链接 showing pop up ,但其中大多数建议使用 WCF。没有wcf就不可能吗?谁能告诉我实现这一目标的方法。

【问题讨论】:

  • 您不应该显示来自服务的窗口。服务旨在无需交互即可运行。
  • 您应该将您的服务标记为Interact with desktop
  • 考虑将消息写入事件日志。使用配置文件启用/禁用记录到事件日志。
  • 我不能从服务中运行一个单独的进程吗?
  • 打开一个命名管道,让一个客户端(非服务)程序在后台运行并观察管道,就是这样。

标签: c# winforms windows-services


【解决方案1】:

无法完成*。在以后的操作系统中,不能作为 Windows 服务工作的操作系统不允许与桌面交互 - 而是由 Windows 服务提供的 UI 显示在 Session 0 中,这是一个通常对最终用户不可见的特殊登录会话。

您应该做的是编写一个单独的 Windows 窗体应用程序,该应用程序始终在运行,但并不总是可见(可能有该应用程序 run at startup 并在 notification area 中有一个图标)并使用一些与 Windows 服务通信IPC的形式

当 Windows 服务希望向用户显示一些 UI 时,它会向应用程序发送一条消息,该应用程序又向最终用户显示所需的 UI。

**或者至少绝对不应该这样做*

【讨论】:

  • 天哪,Windows 现在太可怕了。如果你这样做,你还不如创建一个始终运行的异常表单应用程序并完全放弃该服务。
  • @Tommy 除非它只有在有人登录时才会运行。你需要服务(即使没有人登录也能完成繁重的工作)和桌面应用程序来向任何人发出通知已登录。这种方式更有意义,尤其是当您考虑多个会话时 - 如果多个用户登录,那么应该向哪个用户显示服务的 UI?
  • 服务可以使用 WCF 向 GUI 应用程序发送消息(反之亦然)。 WCF 是最新版本的 IPC。
【解决方案2】:

我只是指StackOverflow中另一个链接中给出的答案

How to communicate with a windows service from an application that interacts with the desktop?

答案是:

请注意,如果您计划最终在 Windows Vista 或 Windows Server 2008 上进行部署,那么今天可以完成的许多方法都行不通。这是因为引入了一项名为“Session 0 Isolation”的新安全功能。

现在,大多数 Windows 服务已移至会话 0 中运行,以便将它们与系统的其余部分正确隔离。对此的扩展是,第一个登录系统的用户不再被放置在 Session #0 中,他们被放置在 Session 1 中。因此,隔离将破坏在服务和桌面应用程序之间进行某些类型通信的代码。

在服务和应用程序之间进行通信时,今天编写可在 Vista 和 Server 2008 上运行的代码的最佳方法是使用适当的跨进程 API,如 RPC、命名管道等。不要使用 SendMessage/PostMessage因为这将在 Session 0 Isolation 下失败。

http://www.microsoft.com/whdc/system/vista/services.mspx

现在,根据您的要求,您可能会遇到一些麻烦。对于跨平台问题,我不确定是否支持远程处理。您可能必须下拉并一直返回套接字:http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx

【讨论】:

    【解决方案3】:

    选中“与桌面交互”框将在 Windows NT、2000、XP 和 2003 上工作,但感谢Session 0 Isolation,该设置不再像您期望的那样在 Windows Vista 及更高版本中工作。你想think very carefully before developing an interactive service...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多