从窗口服务显示窗体

我正在创建一个窗口服务。 我的要求是在特定的时间间隔内从窗口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(); } 

它不起作用。 两种forms都没有显示,也没有计算过程。 我发现一些链接显示弹出 ,但大多数建议WCF。 没有wcf是不可能的。 任何人都可以告诉我实现这一目标的方法。

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

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

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

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

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

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

答案是:

请注意,如果您计划最终部署在Windows Vista或Windows Server 2008上,那么今天可以采用的许多方法都不起作用。 这是因为引入了一种名为“Session 0 Isolation”的新安全function。

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

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

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

现在,根据您的要求,您将会陷入困境。 对于跨平台问题,我不确定是否支持Remoting。 你可能需要下载并一直回到套接字: http : //msdn.microsoft.com/en-us/library/system.net.sockets.aspx

检查“与桌面交互”框将在Windows NT,2000,XP和2003上运行,但由于会话0隔离 ,设置不再像Windows Vista及更高版本中那样有效。 在开发交互式服务之前,您需要仔细考虑 …