3

i am creating a window service. my requirement is to display window form from window NT service on particular interval. For testing purpose , i just want to display the form on service start:

 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();
        }

it not working. Neither form is showing nor calc process is running. i have found some links showing pop up , but most of them suggesting WCF. isn't it possible without wcf. can anybody show me the way to achieve this.

4

3 回答 3

6

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

相反,您应该编写一个单独的 Windows 窗体应用程序,该应用程序始终在运行,但并不总是可见(可能使该应用程序在启动时运行并在通知区域中有一个图标)并使用某种形式的IPC与 Windows 服务通信

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

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

于 2012-10-18T14:00:59.033 回答
2

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

如何从与桌面交互的应用程序与 Windows 服务进行通信?

答案是:

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

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

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

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

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

于 2012-10-18T17:05:17.447 回答
1

选中“与桌面交互”框将在 Windows NT、2000、XP 和 2003 上工作,但由于会话 0 隔离,该设置不再像您在 Windows Vista 及更高版本中所期望的那样工作。在开发交互式服务之前,您需要仔细考虑...

于 2012-10-18T13:45:53.563 回答