从一个窗口服务显示一个Windows窗体。

12 浏览
0 Comments

从一个窗口服务显示一个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的情况下,这种方式可行吗?有人可以告诉我实现这个的方法吗?

0
0 Comments

问题:如何从一个窗口服务中显示一个Windows窗体?

原因:在Windows Vista或Windows Server 2008中引入了一个名为“Session 0 Isolation”的新安全特性。这个特性导致大多数窗口服务都在Session 0中运行,以将它们与系统的其余部分隔离开来。然而,第一个登录到系统的用户被放置在Session 1中,这导致了在服务和桌面应用程序之间进行某些类型的通信时,隔离被打破。

解决方法:在Vista和Server 2008中进行服务和应用程序之间的通信时,最好使用适当的跨进程API,如RPC、命名管道等。不要使用SendMessage/PostMessage,因为在Session 0 Isolation下会失败。

对于跨平台问题,可能不支持Remoting,可能需要使用低级别的套接字编程。

0
0 Comments

在操作系统中,无法直接在窗口服务(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应用程序各自的优势,提高系统的灵活性和可扩展性。

0
0 Comments

问题原因:由于Session 0隔离的存在,勾选“与桌面交互”选项在Windows Vista及更高版本中不再按预期工作。

解决方法:在开发交互式服务之前要非常谨慎地考虑。

以下是原文内容:

勾选“与桌面交互”选项将在Windows NT、2000、XP和2003上工作,但由于Session 0隔离的存在,该设置在Windows Vista及更高版本中不再按预期工作。在开发交互式服务之前要非常谨慎地考虑。你可以从Session 0隔离的链接中了解更多信息。此外,你也可以参考此链接,了解关于开发交互式服务时需要特别注意的事项。

0