从一个窗口服务显示一个Windows窗体。
从一个窗口服务显示一个Windows窗体。
我正在创建一个窗口服务。我的要求是在特定的时间间隔内从Windows NT服务中显示窗口表单。为了测试目的,我只想在服务启动时显示表单:
protected override void OnStart(string[] args) { eventLog1.WriteEntry("在OnStart中-显示表单之前"); Messager_Form obj = new Messager_Form(); obj.Show(); // System.Diagnostics.Process.Start("calc.exe"); eventLog1.WriteEntry("在OnStart中-显示表单之后"); // timer1.Start(); }
它没有起作用。窗体和计算器进程都没有显示。我找到了一些链接
显示弹出窗口,但大部分建议使用WCF。没有WCF的情况下,这种方式可行吗?有人可以告诉我实现这个的方法吗?
问题:如何从一个窗口服务中显示一个Windows窗体?
原因:在Windows Vista或Windows Server 2008中引入了一个名为“Session 0 Isolation”的新安全特性。这个特性导致大多数窗口服务都在Session 0中运行,以将它们与系统的其余部分隔离开来。然而,第一个登录到系统的用户被放置在Session 1中,这导致了在服务和桌面应用程序之间进行某些类型的通信时,隔离被打破。
解决方法:在Vista和Server 2008中进行服务和应用程序之间的通信时,最好使用适当的跨进程API,如RPC、命名管道等。不要使用SendMessage/PostMessage,因为在Session 0 Isolation下会失败。
对于跨平台问题,可能不支持Remoting,可能需要使用低级别的套接字编程。
在操作系统中,无法直接在窗口服务(Windows Service)中显示Windows窗体(Windows Form)。在较新的操作系统中,窗口服务被禁止与桌面进行交互,而是在一个特殊的登录会话中显示UI,这个会话通常对终端用户不可见。所以,我们需要找到一种解决方法。
解决方法是编写一个独立的Windows窗体应用程序,该应用程序始终在运行,但不一定可见(可以让该应用程序在启动时自动运行,并在通知区域显示图标),并使用某种形式的进程间通信(IPC)与窗口服务进行通信。
当窗口服务希望向用户显示一些UI时,它会向应用程序发送一条消息,然后应用程序会显示所需的UI给终端用户。
代码示例:
// 窗口服务中发送消息到GUI应用程序 using System.ServiceModel; public interface IMyService { [OperationContract] void ShowUI(); } public class MyService : IMyService { public void ShowUI() { // 发送消息到GUI应用程序 // ... } } // GUI应用程序中接收来自窗口服务的消息 using System.ServiceModel; public class MyClient : ClientBase, IMyService { public void ShowUI() { // 接收来自窗口服务的消息并显示UI // ... } } // 窗口服务中调用GUI应用程序的方法 public void CallGUIApplication() { MyClient client = new MyClient(); client.ShowUI(); }
通过以上方法,窗口服务与GUI应用程序之间可以进行通信,并实现在窗口服务中显示UI的需求。这样做的好处是,窗口服务可以在无用户登录的情况下执行重要的任务,而GUI应用程序负责向登录用户显示通知。特别是在考虑到多个登录会话的情况下,这种方式更加合理,因为如果有多个用户登录,窗口服务的UI应该显示给哪个用户呢?
通过使用WCF(Windows Communication Foundation),窗口服务和GUI应用程序之间可以进行高效的通信。WCF是最新版本的IPC(进程间通信)技术,可以方便地在不同的应用程序之间进行消息传递和数据交互。
,通过编写一个独立的Windows窗体应用程序,并使用IPC技术与窗口服务进行通信,可以实现在窗口服务中显示UI的需求。这种方法能够充分发挥窗口服务和GUI应用程序各自的优势,提高系统的灵活性和可扩展性。
问题原因:由于Session 0隔离的存在,勾选“与桌面交互”选项在Windows Vista及更高版本中不再按预期工作。
解决方法:在开发交互式服务之前要非常谨慎地考虑。
以下是原文内容:
勾选“与桌面交互”选项将在Windows NT、2000、XP和2003上工作,但由于Session 0隔离的存在,该设置在Windows Vista及更高版本中不再按预期工作。在开发交互式服务之前要非常谨慎地考虑。你可以从Session 0隔离的链接中了解更多信息。此外,你也可以参考此链接,了解关于开发交互式服务时需要特别注意的事项。