从窗口服务中显示一个Windows表单

3

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

IT出了问题。表单没有显示,计算过程也没有运行。我找到了一些链接显示弹出窗口,但大部分都建议使用WCF。难道没有不需要WCF的方法吗?有人能告诉我如何实现吗?


3
服务不应该显示窗口。服务旨在无需交互运行。 - Daniel Hilgarth
1
你应该将你的服务标记为“与桌面交互”。 - L.B
考虑编写消息到事件日志。使用配置文件来启用/禁用记录到事件日志的功能。 - jags
5
打开一个命名管道,让一个非服务程序在后台运行并监听该管道,就是这样。 - Alvin Wong
@Arshad 例如 http://www.switchonthecode.com/tutorials/interprocess-communication-using-named-pipes-in-csharp - stuartd
显示剩余12条评论
3个回答

5
无法实现。在较新的操作系统中,Windows服务被禁止与桌面交互,因此由Windows服务呈现的UI将显示在Session 0中,这是一种特殊的登录会话,通常对最终用户不可见。
相反,您应编写一个单独的Windows Forms应用程序,该应用程序始终运行但不总是可见(可能使该应用程序在启动时运行并在通知区域中具有图标),并使用某种形式的IPC与Windows服务进行通信。
当Windows服务希望向用户显示某些UI时,它会向应用程序发送消息,然后应用程序向最终用户显示所需的UI。
*或者至少肯定不应该这样做。

1
老天,现在的Windows太可怕了。如果你这样做,还不如直接制作一个总是运行并摆脱服务的表单应用程序。 - uSeRnAmEhAhAhAhAhA
3
除非有人登录,否则它只会运行。你需要同时拥有服务(即使没有人登录也能完成繁重的工作),以及桌面应用程序向已登录的用户发送通知。这样做更有意义,特别是考虑到多个会话 - 如果多个用户都已登录,则应该从服务中显示哪个用户的UI? - Justin
该服务可以使用 WCF 向 GUI 应用程序发送消息(或反之亦然)。WCF 是最近版本的 IPC。 - Fer

2

我只是在参考StackOverflow上另一个链接中给出的答案。

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

回答是:

请注意,如果您计划最终部署在Windows Vista或Windows Server 2008上,则今天可以执行此操作的许多方式将无法正常工作。这是因为引入了一种名为“Session 0隔离”的新安全功能。

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

今天编写旨在在Vista和Server 2008上正常工作的服务和应用程序之间进行通信的最佳方法是使用适当的跨进程API,例如RPC,Named Pipes等。 不要使用SendMessage / PostMessage,因为在Session 0隔离下会失败。

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

现在,考虑到您的要求,您可能会遇到一些困难。对于跨平台问题,我不确定Remoting是否受支持。您可能需要回退并完全使用套接字:http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx


1
勾选“与桌面交互”框将在Windows NT、2000、XP和2003上工作,但由于Session 0 Isolation的存在,在Windows Vista及以后的版本中该设置不再按您的期望工作。在开发交互式服务之前,您需要非常仔细地考虑...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接