从窗口服务显示窗体

时间:2012-10-18 11:03:56

标签: c# winforms windows-services

我正在创建一个窗口服务。我的要求是在特定的时间间隔内从窗口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是不可能的。任何人都可以告诉我实现这一目标的方法。

3 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分: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中运行,以便将它们与系统的其余部分正确隔离。对此的扩展是第一个登录系统的用户不再被放置在会话#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

答案 2 :(得分:1)

选中“与桌面交互”框可以在Windows NT,2000,XP和2003上运行,但感谢Session 0 Isolation该设置在Windows Vista及更高版本中不再有效。你想要think very carefully before developing an interactive service ......